【问题标题】:Reverse the direction of a LinearLayout反转 LinearLayout 的方向
【发布时间】:2012-12-16 17:15:21
【问题描述】:

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

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

【问题讨论】:

    标签: android android-layout android-ui


    【解决方案1】:

    通常我会说您无法使用标准 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));
    }
    

    【讨论】:

    • @mtmmurdock 这是一个很好的解决方案,它可以动态工作。但他知道相同类型的意见 r 那么我的解决方案会更好。无论如何+1。 :)
    • 一个小修正,我将第二个 for 循环中的 "="。它工作得很好!谢谢。
    【解决方案2】:

    只需将以下代码添加到LinearLayout

    android:layoutDirection="rtl"
    

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

    【讨论】:

      【解决方案3】:

      这是最简单的方法:)

      for(int k = ll.getChildCount()-1 ; k >= 0 ; k--)
      {
          View item = ll.getChildAt(k);
          ll.removeViewAt(k);
          ll.addView(item);
      }
      

      【讨论】:

        【解决方案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

        【讨论】:

          【解决方案5】:

          简单的方法试试这个

          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);
          

          【讨论】:

            【解决方案6】:

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

            不支持,抱歉。

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

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

            或者,欢迎您创建自己的 LinearLayout 子类(或克隆 LinearLayout)来提供此功能。

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

            【讨论】:

              【解决方案7】:

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

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

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

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                  【解决方案9】:
                  <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....等

                  【讨论】:

                  • 这是一个很好的解决方案,但仅当所有三个(或至少第一个和最后一个)视图都属于同一类型时才有效。如果它们是不同的类型或具有不同的属性怎么办?你的解决方案不会扭转这些。
                  • @mtmurdock 在这种情况下,他必须根据他的逻辑使用一个 if-else。
                  • If-else 不能改变对象的类型。您提议的内容不会更改顺序,它只会更改存储在每个视图中的数据,从而呈现更改顺序的外观。
                  • 你没明白我的意思。无论如何,一切都取决于提问者。
                  猜你喜欢
                  • 2018-09-23
                  • 2015-04-18
                  • 1970-01-01
                  • 2015-07-08
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-10-27
                  • 1970-01-01
                  相关资源
                  最近更新 更多