Android 通过只知道视图的宽度和重量来设置视图的高度,使其成为方形

Android 通过只知道视图的宽度和重量来设置视图的高度,使其成为方形,android,Android,我有这样一个场景: 一个水平线性布局,用于填充容器和weightSum=100,内部有两个视图,每个视图的重量为50 现在我如何使这两个视图成正方形(例如,高度必须等于其宽度)。LinearLayout行的数量是未知的,因此基本上,在这种情况下,我无法将它们包装在带有权重的垂直容器中 现在我如何使这两个视图成正方形(例如,高度必须为 等于它们的宽度) 如果在线性布局中只有这两个视图,则有两个选项: 不要直接将布局文件设置为内容视图,而是将其放大,以便从该文件中引用根目录。然后在该根视图上发布一个

我有这样一个场景: 一个水平线性布局,用于填充容器和
weightSum=100
,内部有两个视图,每个视图的重量为50

现在我如何使这两个视图成正方形(例如,高度必须等于其宽度)。LinearLayout行的数量是未知的,因此基本上,在这种情况下,我无法将它们包装在带有权重的垂直容器中

现在我如何使这两个视图成正方形(例如,高度必须为 等于它们的宽度)

如果在
线性布局中只有这两个视图,则有两个选项:

  • 不要直接将布局文件设置为内容视图,而是将其放大,以便从该文件中引用根目录。然后在该根视图上发布一个
    Runnable
    ,计算所需高度并将其设置回包装它们的
    LinearLayout
    的两个子项:

    final View v = getLayoutInflater().inflate(
            R.layout.views_specialheight, null);
    v.post(new Runnable() {
    
        @Override
        public void run() {
            setupHeight((ViewGroup) v);
        }
    });
    setContentView(v);
    
    其中
    setupHeight()
    是方法:

    private void setupHeight(ViewGroup vg) {
        int count = vg.getChildCount();
        for (int i = 0; i < count; i++) {
            final View v = vg.getChildAt(i);            
            if (v instanceof LinearLayout) {
                int width = v.getWidth();
                LinearLayout.LayoutParams lp;
                View one = ((LinearLayout) v).getChildAt(0);
                lp = (LinearLayout.LayoutParams) one.getLayoutParams();
                lp.height = width / 2;
                one.setLayoutParams(lp);
                View two = ((LinearLayout) v).getChildAt(1);
                lp = (LinearLayout.LayoutParams) two.getLayoutParams();
                lp.height = width / 2;
                two.setLayoutParams(lp);
            }
        }
    }
    
  • SpecialHeightViewGroup
    是这样一个类:

    <com.luksprog.oat.views.SpecialHeightViewGroup
         android:layout_width="match_parent"
         android:layout_height="wrap_content" >
    
       <Button
           android:id="@+id/button1"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:background="#0077cc"
           android:text="Button" />
    
       <Button
           android:id="@+id/button2"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:background="#99cc00"
           android:text="Button" />
    </com.luksprog.oat.views.SpecialHeightViewGroup>
    
    class SpecialHeightViewGroup extends ViewGroup {
    
    public SpecialHeightViewGroup(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
    }
    
    public SpecialHeightViewGroup(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    
    public SpecialHeightViewGroup(Context context) {
        super(context);
    }
    
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        if (widthMode == MeasureSpec.EXACTLY
                || widthMode == MeasureSpec.AT_MOST) {
            measureChildren(MeasureSpec.makeMeasureSpec(widthSize / 2,
                    MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(
                    widthSize / 2, MeasureSpec.EXACTLY));
            measureChildren(MeasureSpec.makeMeasureSpec(widthSize / 2,
                    MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(
                    widthSize / 2, MeasureSpec.EXACTLY));
            setMeasuredDimension(widthSize, widthSize / 2);
        } else {
            widthSize = 800; // we don't have restrictions, make it as big as we want
            measureChildren(MeasureSpec.makeMeasureSpec(widthSize / 2,
                    MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(
                    widthSize / 2, MeasureSpec.EXACTLY));
            measureChildren(MeasureSpec.makeMeasureSpec(widthSize / 2,
                    MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(
                    widthSize / 2, MeasureSpec.EXACTLY));
            setMeasuredDimension(widthSize, 400);
        }       
    }
    
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {      
        View one = getChildAt(0);
        one.layout(0, 0, getWidth() / 2, getHeight());
        View two = getChildAt(1);
        two.layout(getWidth() / 2, 0, getWidth(), getHeight());     
    }
    
    }
    
    自定义类没有经过适当的测试,因此可能有bug(这只是一个示例)


    Offtopic:您是否正在尝试在新的Windows手机上创建一个类似于“瓷砖”的用户界面?

    您是通过编程方式还是通过界面生成器?通过Eclipse的XML编辑器创建这些布局。是的,我创建这些界面是为了重新创建诺基亚Lumia用户界面。例如:我从来没有想到在Android中创建像一堆带有正方形的行这样简单的东西会这么复杂。@ColorWP.com第一种方法没有那么复杂,但最终它取决于如何处理这些行。您可能还需要查看
    GridLayout