vertical studio linearlayout example ejemplo developers constraint android android-layout android-ui

android - studio - Invertir la dirección de un LinearLayout



table layout android (9)

¿Cómo puedo invertir la dirección de un diseño lineal?

Eso no es compatible, lo siento.

Mi objetivo es inflar las instancias de zurdos y diestros de un diseño XML.

Le invitamos a inflarlos desde un diseño XML, pero luego deberá eliminar todos los elementos secundarios de uno y revertir su orden en el código Java. Puede ser que esto sea más simple que mantener los dos archivos de diseño separados, pero definitivamente no es automático.

O bien, puede crear su propia subclase de LinearLayout (o tal vez clonar LinearLayout ) que ofrece esta característica.

Android 4.2 y superior ofrece soporte RTL para LinearLayout , pero está vinculado a la configuración regional y se aplicaría a todos los contenedores LinearLayout horizontales en su aplicación.

¿Cómo puedo invertir la dirección de un diseño lineal?

por ejemplo, si mi diseño es [view1, view2, view3] quiero crear [view3, view2, view1]. Mi objetivo es inflar las instancias de zurdos y diestros de un diseño XML.


De manera simple prueba esto

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


En general, diría que no puede hacer esto utilizando el SDK estándar. Sin embargo, podría crear un método que saque todas las subvistas de LinearLayout, las elimine de LinearLayout y luego las agregue en el orden inverso.

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


Este es el enfoque más simple :)

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


Para las respuestas previas, si desea conservar el ancho / alto de las vistas, calculado por pase directo (es decir, rellenar el contenido principal / envolvente), debe establecerlas explícitamente:

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

quizás tendrá que usar la publicación para ver para asegurarse de que se calculan los tamaños de las vistas. y agregue un controlador para que los cambios de orientación tengan los tamaños recalculados correctamente.


Puede controlar la dirección del diseño directamente a través de layoutDirection. En este código detectamos si la dirección natural es RTL, y la dirección inversa, obviamente, uno puede aplicar su propia lógica a la inversión:

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

O a través de XML en caso de que desee anular la dirección natural constantemente:

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

La detección de RTL se toma de esta pregunta: Identificar el lenguaje RTL en Android


Puede probar ViewCompat.setLayoutDirection(view, direction)


Solo agrega el siguiente código a LinearLayout :

android:layoutDirection="rtl"

Pero invierte permanentemente el orden, no solo para los locales RTL :(


<LinearLayout android:id="@+id/parent" ...... ......> view1 view2 view2 <LinearLayout/>

Ahora puedes probar esto

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

Aquí por Vista , puede ser TextView, Button .... etc.