From 5e5e6ccc37151c3e5d5272e8c1997955b6bed069 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Fri, 22 Jan 2010 15:08:38 -0800 Subject: [PATCH] Make dialogs look better when their content is small. --- .../internal/widget/WeightedLinearLayout.java | 84 +++++++++++++++++++ core/res/res/layout/alert_dialog.xml | 8 +- core/res/res/values/attrs.xml | 5 ++ 3 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 core/java/com/android/internal/widget/WeightedLinearLayout.java diff --git a/core/java/com/android/internal/widget/WeightedLinearLayout.java b/core/java/com/android/internal/widget/WeightedLinearLayout.java new file mode 100644 index 0000000000000..b90204e7cd0d8 --- /dev/null +++ b/core/java/com/android/internal/widget/WeightedLinearLayout.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.widget.LinearLayout; + +import static android.view.View.MeasureSpec.*; +import static com.android.internal.R.*; + +/** + * A special layout when measured in AT_MOST will take up a given percentage of + * the available space. + */ +public class WeightedLinearLayout extends LinearLayout { + private float mMajorWeight; + private float mMinorWeight; + + public WeightedLinearLayout(Context context) { + super(context); + } + + public WeightedLinearLayout(Context context, AttributeSet attrs) { + super(context, attrs); + + TypedArray a = + context.obtainStyledAttributes(attrs, styleable.WeightedLinearLayout); + + mMajorWeight = a.getFloat(styleable.WeightedLinearLayout_majorWeight, 0.0f); + mMinorWeight = a.getFloat(styleable.WeightedLinearLayout_minorWeight, 0.0f); + + a.recycle(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + final DisplayMetrics metrics = getContext().getResources().getDisplayMetrics(); + final boolean isPortrait = metrics.widthPixels < metrics.heightPixels; + + final int widthMode = getMode(widthMeasureSpec); + + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + int width = getMeasuredWidth(); + int height = getMeasuredHeight(); + boolean measure = false; + + final int widthSize = getSize(widthMeasureSpec); + widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, EXACTLY); + heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, EXACTLY); + + final float widthWeight = isPortrait ? mMinorWeight : mMajorWeight; + if (widthMode == AT_MOST && widthWeight > 0.0f) { + if (width < (widthSize * widthWeight)) { + widthMeasureSpec = MeasureSpec.makeMeasureSpec((int) (widthSize * widthWeight), + EXACTLY); + measure = true; + } + } + + // TODO: Support height? + + if (measure) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + } +} diff --git a/core/res/res/layout/alert_dialog.xml b/core/res/res/layout/alert_dialog.xml index 4a63c5bde85e6..231e11c2c3278 100644 --- a/core/res/res/layout/alert_dialog.xml +++ b/core/res/res/layout/alert_dialog.xml @@ -18,7 +18,8 @@ */ --> - + android:majorWeight="0.5" + android:minorWeight="0.8"> - + diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 140ab098b3c68..287e3a082d787 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -2334,6 +2334,11 @@ + + + + +