studio - ¿Cómo obtener dirección de texto en Android y cambiar el diseño de forma dinámica según la dirección?
string value android (3)
Solución, era más fácil de lo que pensaba :) Gracias a JAVA
Hay clase Bidi . Esta clase tiene el método getBaseLevel () que devuelve 0 si su texto es de izquierda a derecha, de lo contrario 1 (si es de derecha a izquierda).
Entonces, este es mi código:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
Bidi bidi = new Bidi(userList.get(position).getName(), Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
if(bidi.getBaseLevel() == 0)
convertView = myInflater.inflate(R.layout.list_add_friends_row, null);
else
convertView = myInflater.inflate(R.layout.list_add_friends_row_mirror, null);
...
y el resultado es:
=============
Actualización :
Hay otro método, baseIsLeftToRight () que podría ser mejor para ser utilizado en la declaración if. El resultado fue el mismo que el anterior.
Bidi bidi = new Bidi(userList.get(position).getName(), Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
if(bidi.baseIsLeftToRight())
convertView = myInflater.inflate(R.layout.list_add_friends_row, null);
else
convertView = myInflater.inflate(R.layout.list_add_friends_row_mirror, null);
Estoy investigando la viabilidad de cambiar la IU de forma dinámica en función de la dirección de un texto. Aunque Google admite lenguajes RTL (ref: soporte RTL nativo en Android 4.2 ), pero no cubre una situación en la que la aplicación tenga una mezcla de contenido LTR y RTL.
La solución de Google es correcta si tenemos una aplicación multilingüe y tiene diferentes fuentes de datos estáticos (como elementos de menú) en diferentes idiomas. Sin embargo, no encontré ningún otro documento sobre cómo cambiar el diseño de forma dinámica en función de la dirección del contenido de texto.
La siguiente imagen muestra el diseño actual de mi aplicación de prueba. La lista proviene de Facebook (lista de mis amigos) y contiene nombres en inglés y en persa.
Mi solución es tener dos diseños (uno para LTR y uno para RTL) en el adaptador y asignarlos según la dirección del nombre. Entonces, escribí las siguientes líneas de código:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(position % 2 == 0)
convertView = myInflater.inflate(R.layout.list_add_friends_row, null);
else
convertView = myInflater.inflate(R.layout.list_add_friends_row_mirror, null);
holder = new ViewHolder();
holder.llSection = (LinearLayout) convertView.findViewById(R.id.section);
holder.tvUserName = (TextView) convertView.findViewById(R.id.tvUserName);
holder.ivPicture = (ImageView) convertView.findViewById(R.id.ivPicture);
holder.btnAdd = (Button) convertView.findViewById(R.id.btnAdd);
convertView.setTag(holder);
holder.btnAdd.setTag(position);
holder.tvUserName.setText(userList.get(position).getName());
imageDownloader.displayImage(holder.ivPicture, userList.get(position).getPhotoUrl());
...
return convertView;
}
y el resultado es:
He duplicado filas según si la fila es par o impar. Ahora, mi pregunta es cómo duplicar la interfaz de usuario basada en el nombre. Creo que debería cambiar la condición de cláusula de if(position % 2 == 0)
a algo como if(isNameLTR(FIRST_CHAR_OF_NAME))
. No tengo idea de cómo implementar este método.
¿Cómo puedo saber que un personaje es LTR ot RTL? (Creo que Android sabe que el primer carácter de la palabra es RTL o LTR; por eso, cuando el ancho de la vista de texto coincide con el padre, alinea el texto a la derecha si el carácter es RLT y hacia la izquierda si el carácter es LTR).
Cualquier sugerencia o comentario sería apreciado. Gracias
Use textAlignment
con gravity
para obtener todos los textos RIGHT o LEFT
android:gravity="right"
android:textAlignment="gravity"
Si el texto está en un TextView
, entonces todo lo que tienes que hacer es
android:textDirection="anyRtl"
forzar RTL. Vea las otras opciones para sus requisitos.
Puede haber casos en que el texto en idiomas mixtos no se muestre en un TextView
. Por ejemplo, el texto puede pasarse en una Intent
compartida a Gmail o WhatsApp, y así sucesivamente. En tales casos, debe usar una combinación de las siguientes clases:
Como se cita en la documentación, estos son ...
Clase de utilidad para formatear texto para visualizar en un contexto de direccionalidad potencialmente opuesta sin engrosamiento. La direccionalidad del contexto se establece en la creación del formateador y la direccionalidad del texto se puede estimar o pasar cuando se conoce.
Entonces, por ejemplo, supongamos que tiene un String
que tiene una combinación de inglés y árabe, y necesita que el texto sea
- de derecha a izquierda (RTL).
- siempre alineado a la derecha , incluso si la oración comienza con el inglés.
- Palabras inglesas y árabes en la secuencia correcta y sin engrosamiento.
entonces puede lograr esto usando el método unicodeWrap()
siguiente manera:
String mixedLanguageText = ... // mixed-language text
if(BidiFormatter.getInstance().isRtlContext()){
Locale rtlLocale = ... // RTL locale
mixedLanguageText = BidiFormatter.getInstance(rtlLocale).unicodeWrap(mixedLanguageText, TextDirectionHeuristics.ANYRTL_LTR);
}
Esto convertiría la cadena en RTL y la alinearía hacia la izquierda, si hubiera un solo carácter de lenguaje RTL en la cadena, y si no lo hiciera de nuevo a LTR. Si desea que la cadena sea RTL, incluso si está completa, digamos Inglés (un idioma LTR), entonces podría usar TextDirectionHeuristics.RTL
lugar de TextDirectionHeuristics.ANYRTL_LTR
.
Esta es la forma correcta de manejar texto mixto en ausencia de TextView
. Es interesante que, como dice la documentación,
También observe que estas heurísticas de dirección corresponden a los mismos tipos de constantes proporcionadas en la clase
View
parasetTextDirection()
, comoTEXT_DIRECTION_RTL
.
Otras referencias:
1. Escribir mezcla de archivos de texto entre árabe e inglés .