線形レイアウトの方向を反転するにはどうすればよいですか?
たとえば、レイアウトが [view1, view2, view3] の場合、[view3, view2, view1] を作成します。私の目標は、1 つの XML レイアウトから左利きと右利きのインスタンスを膨らませることです。
線形レイアウトの方向を反転するにはどうすればよいですか?
たとえば、レイアウトが [view1, view2, view3] の場合、[view3, view2, view1] を作成します。私の目標は、1 つの XML レイアウトから左利きと右利きのインスタンスを膨らませることです。
通常、標準の 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));
}
これは最も簡単なアプローチです:)
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 の検出は、次の質問から取得されます: Android での RTL 言語の識別
これを試す簡単な方法
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);
線形レイアウトの方向を反転するにはどうすればよいですか?
それはサポートされていません。申し訳ありません。
私の目標は、1 つの XML レイアウトから左利きと右利きのインスタンスを膨らませることです。
1 つの XML レイアウトから両方をインフレートしてもかまいませんが、その場合、一方のすべての子を削除し、Java コードでそれらの順序を逆にする必要があります。これは、2 つの別々のレイアウト ファイルを維持するよりも簡単かもしれませんが、間違いなく自動ではありません。
または、この機能を提供する独自の のサブクラスLinearLayout
(またはおそらく clone ) を作成することもできます。LinearLayout
Android 4.2 以降では の RTL サポートが提供LinearLayout
されますが、これはロケールに関連付けられてLinearLayout
おり、アプリ内のすべての水平コンテナーに適用されます。
前の回答に注意してください。ダイレクトパス(つまり、親/ラップコンテンツを埋める)によって計算されたビューの幅/高さを保持したい場合は、それらを明示的に設定する必要があります:
for (int i = views.size() - 1; i >= 0; i--)
{
View v = views.get(i);
linearLayoutHor.addView(v, v.getWidth(), v.getHeight());
}
おそらく、ビューのサイズが確実に計算されるように、ポストからビューを使用する必要があります。サイズが正しく再計算されるように、向きの変更のハンドラーを追加します。
<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 ....などになります。