17

如何反转线性布局的方向?

例如,如果我的布局是 [view1, view2, view3] 我想创建 [view3, view2, view1]。我的目标是从一个 XML 布局中扩展左手和右手实例。

4

9 回答 9

13

一般来说,我会说你不能使用标准 SDK 来做到这一点。但是,您可以创建一个方法,从 LinearLayout 中获取所有子视图,将它们从 LinearLayout 中删除,然后以相反的顺序将它们添加回来。

LinearLayout ll = // inflate
ArrayList<View> views = new ArrayList<View>();
for(int x = 0; x < ll.getChildCount(); x++) {
    views.add(ll.getChildAt(x));
}
ll.removeAllViews();
for(int x = views.size() - 1; x >= 0; x--) {
    ll.addView(views.get(x));
}
于 2012-12-16T17:30:55.593 回答
7

只需将以下代码添加到LinearLayout

android:layoutDirection="rtl"

但它会永久颠倒顺序 - 不仅适用于 RTL 语言环境:(

于 2018-09-16T02:24:50.237 回答
6

这是最简单的方法:)

for(int k = ll.getChildCount()-1 ; k >= 0 ; k--)
{
    View item = ll.getChildAt(k);
    ll.removeViewAt(k);
    ll.addView(item);
}
于 2015-05-03T05:00:16.490 回答
4

您可以直接通过 layoutDirection 控制布局的方向。在这段代码中,我们检测自然方向是否为 RTL,并反转方向,显然可以应用您自己的逻辑来反转:

LinearLayout buttonsContainer = (LinearLayout) findViewById(R.id.buttonsContainer);          
buttonsContainer.setLayoutDirection(isRTL() ? LinearLayout.LAYOUT_DIRECTION_LTR : 
                                    LinearLayout.LAYOUT_DIRECTION_RTL)

public static boolean isRTL() {
        return isRTL(Locale.getDefault());
}

public static boolean isRTL(Locale locale) {
    final int directionality = Character.getDirectionality(locale.getDisplayName().charAt(0));
    return directionality == Character.DIRECTIONALITY_RIGHT_TO_LEFT ||
            directionality == Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC;
}

或者通过 XML,以防您想要不断地覆盖自然方向:

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:layoutDirection="ltr"
        >
...
</LinearLayout>

RTL的检测取自这个问题:Identifyng RTL language in Android

于 2016-10-17T07:06:06.023 回答
2

简单的方法试试这个

LinearLayout ll = (LinearLayout)findViewById(R.id.ll1);
    View v0 = ll.getChildAt(0);
    View v1 = ll.getChildAt(1);
    View v2 = ll.getChildAt(2);

    ll.removeAllViews();

    ll.addView(v2);
    ll.addView(v1);
    ll.addView(v0);
于 2012-12-16T17:36:34.600 回答
0

如何反转线性布局的方向?

不支持,抱歉。

我的目标是从一个 XML 布局中扩展左手和右手实例。

欢迎您从一个 XML 布局中对它们进行扩展,但随后您需要删除其中一个的所有子级并在 Java 代码中颠倒它们的顺序。这可能比维护两个单独的布局文件更简单,但绝对不是自动的。

或者,欢迎您创建自己的提供此功能的子类LinearLayout(或者可能是 clone )。LinearLayout

Android 4.2 及更高版本为 提供 RTL 支持LinearLayout,但这与语言环境相关,并且适用LinearLayout于您应用中的所有水平容器。

于 2012-12-16T17:28:33.223 回答
0

注意上一个答案,如果您想保留视图的宽度/高度,通过直接传递(即填充父/包装内容)计算,您必须明确设置它们:

for (int i = views.size() - 1; i >= 0; i--)
{
    View v = views.get(i);
    linearLayoutHor.addView(v, v.getWidth(), v.getHeight());
}

也许您将不得不使用 post 来查看以确保计算视图的大小。并为方向更改添加处理程序以正确重新计算大小。

于 2014-10-27T00:20:25.893 回答
0

你可以试试ViewCompat.setLayoutDirection(view, direction)

于 2017-03-13T04:11:38.030 回答
-1
<LinearLayout
    android:id="@+id/parent"
    ...... 
    ......>
  view1
  view2
  view2
<LinearLayout/>

现在你可以试试这个

LinearLayout parent = (LinearLayout)findViewById(R.id.parent);
View view1 = (View)parent.getChildAt(0);  // it will give first view
View view3 = (View)parent.getChildAt(2);  // it will give you third view

这里的View可以是 TextView,Button....等。

于 2012-12-16T17:22:59.850 回答