【发布时间】:2012-12-16 17:15:21
【问题描述】:
如何反转线性布局的方向?
例如,如果我的布局是 [view1, view2, view3] 我想创建 [view3, view2, view1]。我的目标是从一个 XML 布局中扩展左手和右手实例。
【问题讨论】:
标签: android android-layout android-ui
如何反转线性布局的方向?
例如,如果我的布局是 [view1, view2, view3] 我想创建 [view3, view2, view1]。我的目标是从一个 XML 布局中扩展左手和右手实例。
【问题讨论】:
标签: android android-layout android-ui
通常我会说您无法使用标准 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));
}
【讨论】:
只需将以下代码添加到LinearLayout:
android:layoutDirection="rtl"
但它会永久颠倒顺序 - 不仅适用于 RTL 语言环境:(
【讨论】:
这是最简单的方法:)
for(int k = ll.getChildCount()-1 ; k >= 0 ; k--)
{
View item = ll.getChildAt(k);
ll.removeViewAt(k);
ll.addView(item);
}
【讨论】:
可以通过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
【讨论】:
简单的方法试试这个
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);
【讨论】:
如何反转线性布局的方向?
不支持,抱歉。
我的目标是从一个 XML 布局中扩充左手和右手实例。
欢迎您从一个 XML 布局中对它们进行扩展,但随后您需要删除一个 XML 布局的所有子级并在 Java 代码中颠倒它们的顺序。这可能比维护两个单独的布局文件更简单,但绝对不是自动的。
或者,欢迎您创建自己的 LinearLayout 子类(或克隆 LinearLayout)来提供此功能。
Android 4.2 及更高版本offers RTL support for LinearLayout,但这与语言环境相关,并且适用于您应用中的所有水平LinearLayout 容器。
【讨论】:
注意上一个答案,如果您想保留视图的宽度/高度,通过直接传递(即填充父/包装内容)计算,您必须明确设置它们:
for (int i = views.size() - 1; i >= 0; i--)
{
View v = views.get(i);
linearLayoutHor.addView(v, v.getWidth(), v.getHeight());
}
也许您必须使用 post 来查看以确保计算视图的大小。并添加处理程序以更改方向以正确重新计算大小。
【讨论】:
你可以试试ViewCompat.setLayoutDirection(view, direction)
【讨论】:
<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....等
【讨论】: