¿Cómo obtener dirección de texto en Android y cambiar el diseño dinámicamente de acuerdo con la dirección?

Estoy haciendo algunas investigaciones sobre factibilidad de cambiar la interfaz de usuario de forma dinámica basada en la dirección de un texto. Aunque Google apoya los idiomas RTL (ref: Soporte nativo de RTL 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 con respecto a cómo cambiar el diseño dinámicamente basado en la dirección del contenido del texto.

La siguiente imagen muestra el diseño actual de mi aplicación de prueba. La lista viene de Facebook (lista de mis amigos) y contiene nombres ingleses y persas.

Introduzca aquí la descripción de la imagen

Mi solución es tener dos diseños (uno para LTR y otro para RTL) en el adaptador y asignar cada uno basado en la dirección del nombre. Por lo tanto, 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:

Introduzca aquí la descripción de la imagen

He reflejado las filas en función de si la fila es par o impar. Ahora, mi pregunta es cómo reflejar la interfaz de usuario basada en el nombre. Creo que debería cambiar la condición de la cláusula de if(position % 2 == 0) a algo como if(isNameLTR(FIRST_CHAR_OF_NAME)) . No tengo ni idea de cómo implementar este método.

¿Cómo puedo saber si un personaje es LTR ot RTL? (Creo que Android sabe primer carácter de la palabra es RTL o LTR es por eso que cuando el ancho de la vista de texto es el padre del partido alinear el texto a la derecha si el carácter es RLT y a la izquierda si el carácter es LTR).

Cualquier sugerencia o comentarios serán apreciados. Gracias

3 Solutions collect form web for “¿Cómo obtener dirección de texto en Android y cambiar el diseño dinámicamente de acuerdo con la dirección?”

Solución, fue más fácil que yo estaba pensando 🙂 Gracias a JAVA

Hay clase Bidi . Esta clase tiene el método getBaseLevel () que devuelve 0 si el texto es de izquierda a derecha, de lo contrario 1 (si es de derecha a izquierda).

Por lo tanto, 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:

Introduzca aquí la descripción de la imagen

Unesdoc.unesco.org unesdoc.unesco.org

Actualización :

Hay otro método, baseIsLeftToRight () que podría ser mejor para ser utilizado en la instrucción if. Resultado igual al 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); 

Utilice textAlignment con gravity para obtener todos los textos a la derecha oa la izquierda

 android:gravity="right" android:textAlignment="gravity" 

Si el texto está en un TextView , todo lo que tienes que hacer es

 android:textDirection="anyRtl" 

Para forzar RTL. Vea las otras opciones para sus requisitos.

Puede haber casos en que el texto en lenguaje mixto no se muestre en un TextView . Por ejemplo, el texto puede ser pasado en un Intent compartir a Gmail o WhatsApp y así sucesivamente. En estos casos, debe utilizar una combinación de las siguientes clases:

  • BidiFormatter
  • TextDirectionHeuristics

Según lo citado en la documentación, estos son …

Clase de utilidad [es] para dar formato al texto para mostrarlo en un contexto potencialmente opuesto a la direccionalidad, sin confusión. 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.

Por ejemplo, digamos que tiene una String que tiene una combinación de inglés y árabe, y necesita el texto para ser

  • Derecha a izquierda (RTL).
  • Siempre alineados a la derecha , incluso si la oración comienza con el inglés.
  • Inglés y árabe palabras en la secuencia correcta y sin garbling.

Entonces usted podría 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 a la izquierda, si incluso un carácter del lenguaje RTL estuviera en la cadena, y se repliegue a LTR de otra manera. Si desea que la cadena sea RTL incluso si está completamente en, por ejemplo Inglés (un lenguaje LTR), entonces podría utilizar TextDirectionHeuristics.RTL lugar de TextDirectionHeuristics.ANYRTL_LTR .

Esta es la forma correcta de manejar texto de dirección mixta en ausencia de un TextView . Curiosamente, como afirma la documentación,

Observe también que estas heurísticas de dirección corresponden a los mismos tipos de constantes proporcionados en la clase View para setTextDirection() , como TEXT_DIRECTION_RTL .

Otras referencias:

1. Escribir una mezcla de texto entre árabe e inglés .

2. Algoritmo Bidireccional Unicode .

  • Letras cirílicas que no se muestran en PDF generadas con iText en Android
  • ¿Cómo puedo tener res / values-pt_PT y res / values-pt_BR en Android?
  • Google Maps Android API v2, título del marcador / muestra incorrecta del fragmento
  • Android: cómo obtener el día actual de la semana (lunes, etc ...) en el idioma del usuario?
  • Soporte de idioma indico para SDK pero no para PhoneGap
  • Uso de la configuración regional para detectar si utiliza unidades imperiales
  • Cómo manejas la internacionalización para "Tu entrada 'xyz' es excelente!"
  • ToUpperCase en Android es incorrecto para los argumentos de dos argumentos y el idioma griego y turco predeterminados
  • Después de la rotación de la pantalla, se cambiará el idioma de mi aplicación
  • Compartir traducciones entre servidor java, ios y android
  • Android sync strings.xml
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.