Use locale (ltr / rtl) para gravedad en TextView

Tengo un TextView simple que debería tener android:gravity="left" para las localizaciones del sistema ltr y android:gravity="right" para las configuraciones del sistema rtl.

La elección obvia sería: android:gravity="start" pero luego, por ejemplo, el texto en inglés siempre estará alineado a la izquierda y hebreo alineado a la derecha.

Así es como se ve con android:gravity="start" :

Configuración regional de LTR:

 | לורם| // incorrect |test | // correct 

RTL locale:

 | לורם| // correct |test | // incorrect 

Se supone que se vea así:

Configuración regional de LTR:

 |לורם | |test | 

RTL locale:

 | לורם| | test| 

¿Es posible hacerlo sin usar una carpeta layout-ldrtl con un archivo xml modificado? Esto complicaría mucho el desarrollo porque tendría que editar un montón de archivos de diseño dos veces …

Editar: una solución para API 17+ es suficiente. Escribí la configuración regional del sistema, pero en realidad estoy permitiendo que el usuario cambie el idioma de la aplicación de esa manera:

 Configuration configuration = context.getResources().getConfiguration(); configuration.setLayoutDirection(selectedLocale); configuration.locale = selectedLocale; context.getResources().updateConfiguration(configuration, context.getResources().getDisplayMetrics()); 

Por lo que sería genial si esta localidad se consideraría para la opción rtl <-> ltr.

Tuve este problema también, puede utilizar estas propiedades con el TextView

 android:textDirection="locale" android:textAlignment="gravity" 

O simplemente añádelo al tema de la aplicación base en styles.xml <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="android:textColorPrimary">@android:color/white</item> <item name="android:textColorSecondary">@android:color/white</item> <item name="colorButtonNormal">@color/colorAccent</item> <item name="android:textAlignment">gravity</item> <item name="android:textDirection">locale</item> </style>

Que funcionó para mí.

 android:layout_width="match_parent" android:textAlignment="viewStart" 

Si la vista de texto se estira al ancho de los padres, no es necesario cambiar la gravedad del elemento. Simplemente alinee el texto al inicio de la vista, el texto se moverá a la posición LTR o RTL, independientemente del contenido del texto (hebreo u occidental).

Es probable que necesite una clase de TextView extendida especial para eso:

 public class LocaleAwareTextView extends TextView { public LocaleAwareTextView(Context context) { super(context); setGravity(getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL ? Gravity.RIGHT : Gravity.LEFT); } public LocaleAwareTextView(Context context, AttributeSet attrs) { super(context, attrs); setGravity(getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL ? Gravity.RIGHT : Gravity.LEFT); } public LocaleAwareTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setGravity(getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL ? Gravity.RIGHT : Gravity.LEFT); } } 

… y utilizar esta clase en sus diseños. Si desea cambiar la configuración regional y todas las orientaciones sobre la marcha, tendrá que volver a cargar los diseños.

Estoy usando esta solución ahora, preferiría una solución simple de xml, pero esto parece mínimo hasta ahora:

 if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) { if (DynamicLanguage.getLayoutDirection(getContext()) == View.LAYOUT_DIRECTION_RTL) { this.textView.setGravity(Gravity.RIGHT); } else { this.textView.setGravity(Gravity.LEFT); } } 
  • Android: findviewbyid: encontrar la vista por id cuando la vista no está en el mismo diseño invocado por setContentView
  • ¿Cuál es la diferencia entre layout-large-v11 y layout-xlarge
  • Botón necesita llenar el botón de radio padre
  • Guía de diseño XML de Android
  • Escala de un dibujable dentro de un botón?
  • Organizar diseños de Android en subcarpetas
  • ¿Alternativas a xml desarrollando el diseño de aplicaciones para Android?
  • Disposición relativa de Android con ancho de botón utilizando el peso
  • ViewPager utilizando archivos xml para las vistas
  • Cambiar LayoutParams programatically no tiene ningún efecto. ¿Por qué?
  • Android: Obtener el tamaño de la disposición del cuerpo de forma dinámica
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.