android - use la configuración regional(ltr/rtl) para la gravedad en TextView
layout right-to-left (4)
Tengo un TextView simple que debería tener android:gravity="left"
para las configuraciones regionales del sistema ltr y android:gravity="right"
para las configuraciones regionales del sistema rtl.
La opció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"
:
LTR localidad:
| לורם| // incorrect
|test | // correct
Localidad de RTL:
| לורם| // correct
|test | // incorrect
se supone que debe verse así:
LTR localidad:
|לורם |
|test |
Localidad de RTL:
| לורם|
| test|
¿Es posible hacer eso sin usar una carpeta layout-ldrtl con un archivo xml modificado? Esto complicaría mucho el desarrollo porque tendría que editar muchos 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 configuración regional se considerara para la opción rtl <-> ltr.
Estoy usando esta solución ahora, preferiría una solución xml simple, pero esto parece mínimo hasta el momento:
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);
}
}
Probablemente necesites una clase especial ampliada de TextView 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 usa esta clase en tus diseños. Si desea cambiar la configuración regional y todas las orientaciones sobre la marcha, deberá volver a cargar sus diseños.
También tuve este problema, puedes usar estas propiedades con TextView
android:textDirection="locale"
android:textAlignment="gravity"
o simplemente agréguelo 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>
eso funcionó para mí.
android:layout_width="match_parent"
android:textAlignment="viewStart"
Si la vista de texto se estira al ancho principal, no hay necesidad de cambiar la gravedad del elemento. Simplemente alinee el texto con el inicio de la vista, el texto se moverá a la posición LTR o RTL, independientemente del contenido del texto (hebreo u occidental).