如果所有子视图都不适合水平放置,如何将布局方向更改为垂直方向

时间:2017-05-03 15:32:02

标签: android android-layout android-linearlayout

我需要根据按钮是否适合水平来改变Linearlayout的方向。例如,如果我们有两个适合屏幕总宽度的按钮,我会在水平LinearLayout中显示它们,但如果它们不合适,我需要以垂直布局显示它们。

我尝试了下面的代码,但因为第三个按钮调整自身大小并开始垂直以适应边界,所以子计数最终仍然小于宽度。有没有办法计算按钮的宽度而不发生这种变化?

mButtonsLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            public void onGlobalLayout() {
                int childCount = mButtonsLayout.getChildCount();
                int childWidth = 0;
                for (int i = 0; i < childCount; i++ ) {
                    View child = mButtonsLayout.getChildAt(i);
                    childWidth += child.getWidth();
                }

                if (mButtonsLayout.getMeasuredWidth() < childWidth) {
                    mButtonsLayout.setOrientation(LinearLayout.VERTICAL);
                } else {
                    mButtonsLayout.setOrientation(LinearLayout.HORIZONTAL);
                }

                ViewTreeObserver viewTreeObserver = mButtonsLayout.getViewTreeObserver();
                if (viewTreeObserver.isAlive()) {
                    viewTreeObserver.removeGlobalOnLayoutListener(this);
                }
            }
        });
    }

这是第三个按钮改变自己的方式。 我想要的结果是如果所有按钮都不适合水平放置,请将方向更改为垂直,以便按钮显示在彼此之上。

enter image description here

2 个答案:

答案 0 :(得分:2)

这不能回答你的问题,但我认为这是实现你想要的一个非常好的选择。

使用Google here,如果水平没有位置,您可以自动排列按钮。

希望它有用

答案 1 :(得分:2)

看看这个library

 <cn.lankton.flowlayout.FlowLayout
        android:id="@+id/flowlayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        app:lineSpacing="10dp"
        android:background="#F0F0F0">

</cn.lankton.flowlayout.FlowLayout>

gradle这个

compile 'cn.lankton:flowlayout:latest version'

enter image description here

这是另一个以编程方式排列视图的库..

FlexBox