如何让一个android ViewGroup及其所有子视图根据最宽的子动态动态保持相等的宽度?

时间:2013-09-29 15:03:17

标签: android layout viewgroup

我希望我的android布局行为如下: 假设SomeLayout是Widget1,Layout2和Widget2的父级,它们从上到下依次显示,如下所示:

|-------SomeLayout-------|
||--------Widget1-------||
||______________________||
||--------Layout2-------||
||______________________||
||--------Widget2-------||
||______________________||
|________________________|

这三个孩子的内容正在发生变化。动态地,当他们改变时,我总是希望具有最宽内容的那个包装到内容。我希望SomeLayout能够包裹那个最宽的孩子,我希望所有其他孩子能够匹配那个最宽的孩子。即使哪一个是最广泛的变化。

我一直在尝试使用比我能算的更多方法来实现这一目标。所有失败。有谁知道通过android布局XML实现这种效果?我愿意使用Java程序化解决方案,如果这是任何人都可以提供的,但我更愿意只通过XML来实现。

2 个答案:

答案 0 :(得分:0)

我希望你的SomeLayout扩展ViewGroup,所以我试图覆盖onMeasure方法,以便以适当的方式测量所有的孩子。 例如

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int specWidth = MeasureSpec.getSize(widthMeasureSpec);
    int maxWidth = 0;
    int maxIndex = 0;
    for (int i = 0; i < getChildCount(); i++){
        View child = getChildAt(i);
        final int widthSpec = MeasureSpec.makeMeasureSpec(
                    specWidth, MeasureSpec.UNSPECIFIED);
        final int heightSpec = MeasureSpec.makeMeasureSpec(
                    0, MeasureSpec.UNSPECIFIED);
        child.measure(widthSpec, heightSpec);
        int width = child.getMeasuredWidth();
        if (width > maxWidth){
            maxWidth = width;
            maxIndex = i;
        }
    }
    for (int i = 0; i < getChildCount(); i++){
        if (i != maxIndex){
            View child = getChildAt(i);
            final int widthSpec = MeasureSpec.makeMeasureSpec(
                    maxWidth, MeasureSpec.EXACTLY);
            final int heightSpec = MeasureSpec.makeMeasureSpec(
                    0, MeasureSpec.UNSPECIFIED);
            child.measure(widthSpec, heightSpec);
        }
    }
    setMeasuredDimension(someMeasuredWidth, someMeasuredHeight);
}

因此,您应该定义最宽的孩子并测量所有其他孩子以调整最大尺寸。之后,您应该根据测量的维度在onLayout方法实现中布局所有子项。

希望它能帮到你

答案 1 :(得分:-1)

好问题伙伴。 开始检查后,我觉得这是一个很好的问题..

这就是你想要的......看看吧......

它只是一个简单的.. 将一些布局宽度应用于wrap_content,并将所有直接子宽度应用于match_parent ..

请参阅下面的示例..您可以使其符合背景颜色。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <!-- This is Your Some Layout -->

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <!-- Widget1 -->

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="2431234vb sset " />

        <!-- Your Layout 2 (inner one) -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="2431234v " />
        </LinearLayout>

        <!-- Widget2 -->
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="2431234vb sset " />
    </LinearLayout>

</LinearLayout>

希望它会帮助你......