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.
- ¿Posible inflar una disposición de XML en un servicio? (Androide)
- Android: layout_height 50% del tamaño de la pantalla
- Encontrar el diseño raíz en la actividad
- Cómo deshabilitar el toque del diseño anterior
- Android: ¿Alinear el botón en la parte inferior derecha de la pantalla usando FrameLayout?
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.
- El diseño gráfico muestra la primera vista de ViewFlipper, ¿cómo ver a los demás?
- Recomponer Disposición de actividad para reproducir vídeo en pantalla completa cuando se gira la pantalla
- Cómo leer el valor de string.xml en android?
- Detectar barra de estado Visibilidad / TYPE_SYSTEM_OVERLAY no cambiar de tamaño automáticamente
- Método para permitir que una sola vista secundaria desborde los límites del grupo de vista?
- Cómo cambiar el icono de un botón mediante programación?
- Cómo establecer la propiedad "android: drawableTop" de un botón en tiempo de ejecución
- Android: IllegalStateException llamando a DialogFragment
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); } }
- ¿Cómo bombardear una aplicación Android con el tiempo?
- Consultas de medios CSS en Nexus 7, la resolución de pantalla no funciona en código