Come get la direzione del text in Android e cambiare il layout in modo dinamico in base alla direzione?

Sto facendo qualche ricerca sulla fattibilità di cambiare UI dynamicmente basata sulla direzione di un text. Anche se Google support linguaggi RTL (ref: supporto nativo RTL in Android 4.2 ), ma non copre una situazione in cui l'applicazione abbia un mix di contenuti LTR e RTL.

La soluzione di Google ha ragione se disponiamo di un'applicazione multilingue e possiede diverse fonti di dati statici (ad esempio voci di menu) in diverse lingue. Tuttavia, non ho trovato nessun altro documento riguardo a come cambiare il layout in modo dinamico in base alla direzione del contenuto del text.

  • Dipaly farsi text in webview android (per i telefoni che non supportno farsi)
  • Android: Ricevi traduzioni mancanti per le stringhe-risorse
  • Formattazione data basata su locale utente su android
  • Cinese semplificato e tradizionale rispetto alle regioni
  • Come gestisci traduzioni per la tua applicazione Android?
  • Locale Valuta Simbolo
  • L'image seguente mostra il disegno attuale della mia app per test. La list viene da Facebook (list dei miei amici) e contiene nomi inglesi e persiani.

    immettere qui la descrizione dell'immagine

    La mia soluzione è avere due layout (uno per LTR e uno per RTL) in adattatore e assegnare ciascuno a seconda della direzione del nome. Così ho scritto le seguenti righe di codice:

    @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; } 

    e il risultato è:

    immettere qui la descrizione dell'immagine

    Ho rispecchiato le righe in base a se la row è pari o dispari. Ora, la mia domanda è come rispecchiare l'interface utente basata sul nome. Penso che dovrei cambiare la condizione di clausola da if(position % 2 == 0) a qualcosa di simile a if(isNameLTR(FIRST_CHAR_OF_NAME)) . Non ho idea di come implementare questo metodo.

    Come faccio a sapere che un personaggio è LTR ot RTL? (Penso che Android conosca il primo carattere della parola è RTL o LTR, ecco perché quando la width della vista di text corrisponde al genitore allinee il text a destra se il carattere è RLT e a sinistra se il carattere è LTR).

    Qualsiasi suggerimento o commenti sarebbero apprezzati. Grazie

    3 Solutions collect form web for “Come get la direzione del text in Android e cambiare il layout in modo dinamico in base alla direzione?”

    Soluzione, era più facile che stavo pensando 🙂 Grazie a JAVA

    C'è la class Bidi . Questa class ha il metodo getBaseLevel () che restituisce 0 se il text è left-to-right altrimenti 1 (se da destra a sinistra).

    Quindi, questo è il mio codice:

     @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); ... 

    e il risultato è:

    immettere qui la descrizione dell'immagine

    =============

    Aggiornamento :

    Esiste un altro metodo, baseIsLeftToRight () che potrebbe essere meglio essere utilizzato in istruzione if. Il risultato era lo stesso di quanto sopra.

     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); 

    Utilizza textAlignment con gravity per get tutti i testi RIGHT o LEFT

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

    Se il text è in un TextView , allora tutto quello che devi fare è

     android:textDirection="anyRtl" 

    per forzare RTL. Vedere le altre opzioni per i tuoi requisiti.

    Ci possono essere casi in cui il text in lingua mista non deve essere mostrato in un TextView . Ad esempio, il text può essere passato in una condivisione di Intent a Gmail o WhatsApp e così via. In questi casi, è necessario utilizzare una combinazione delle seguenti classi:

    • BidiFormatter
    • TextDirectionHeuristics

    Come citato nella documentazione, questi sono …

    Classe di utilità [es] per la formattazione del text per la visualizzazione in un context potenzialmente opposto-direzionale senza intuito. La direzionalità del context è impostata sulla creazione del formatter e la direzionalità del text può essere stimata o passata quando è noto.

    Quindi, ad esempio, dici di avere una String che abbia una combinazione di inglese e arabo e hai bisogno del text

    • da destra a sinistra (RTL).
    • sempre allineato a destra , anche se la frase inizia con l'inglese.
    • Parole in inglese e arabo nella sequenza corretta e senza intrighi.

    allora si potrebbe get questo utilizzando il metodo unicodeWrap() come segue:

     String mixedLanguageText = ... // mixed-language text if(BidiFormatter.getInstance().isRtlContext()){ Locale rtlLocale = ... // RTL locale mixedLanguageText = BidiFormatter.getInstance(rtlLocale).unicodeWrap(mixedLanguageText, TextDirectionHeuristics.ANYRTL_LTR); } 

    Questo converrebbe la string in RTL e l'allinea a sinistra, se anche un carattere RTL è nella string e fallisce a LTR altrimenti. Se si desidera che la string sia RTL anche se è completamente TextDirectionHeuristics.RTL , ad esempio inglese (un linguaggio LTR), è ansible utilizzare TextDirectionHeuristics.RTL invece che TextDirectionHeuristics.ANYRTL_LTR .

    Questo è il modo giusto di gestire il text in modalità mista in assenza di un TextView . È interessante notare, come afferma la documentazione,

    Notate anche che queste euristiche di direzione corrispondono agli stessi tipi di costanti fornite nella class View per setTextDirection() , ad esempio TEXT_DIRECTION_RTL .

    Ulteriori riferimenti:

    1. Scrivere il mix di file di text tra arabo e inglese .

    2. Algoritmo bidirezionale Unicode .

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.