17

線形レイアウトの方向を反転するにはどうすればよいですか?

たとえば、レイアウトが [view1, view2, view3] の場合、[view3, view2, view1] を作成します。私の目標は、1 つの 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 に答える
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 の検出は、次の質問から取得されます: Android での RTL 言語の識別

于 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

線形レイアウトの方向を反転するにはどうすればよいですか?

それはサポートされていません。申し訳ありません。

私の目標は、1 つの XML レイアウトから左利きと右利きのインスタンスを膨らませることです。

1 つの XML レイアウトから両方をインフレートしてもかまいませんが、その場合、一方のすべての子を削除し、Java コードでそれらの順序を逆にする必要があります。これは、2 つの別々のレイアウト ファイルを維持するよりも簡単かもしれませんが、間違いなく自動ではありません。

または、この機能を提供する独自の のサブクラス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());
}

おそらく、ビューのサイズが確実に計算されるように、ポストからビューを使用する必要があります。サイズが正しく再計算されるように、向きの変更のハンドラーを追加します。

于 2014-10-27T00:20:25.893 に答える
-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 に答える