2013-08-02 5 views
11

Ich recherchiere über die Möglichkeit, die Benutzeroberfläche dynamisch zu ändern, basierend auf der Richtung eines Textes. Obwohl Google RTL-Sprachen unterstützt (Ref: Native RTL support in Android 4.2), deckt es jedoch keine Situation ab, in der die Anwendung eine Mischung aus LTR- und RTL-Inhalten aufweist.Wie bekomme ich die Textrichtung in Android und ändere das Layout dynamisch entsprechend der Richtung?

Die Lösung von Google ist richtig, wenn wir eine mehrsprachige App haben und verschiedene Quellen für statische Daten (wie Menüeinträge) in verschiedenen Sprachen haben. Ich habe jedoch kein anderes Dokument gefunden, das sich mit der dynamischen Änderung des Layouts aufgrund der Richtung des Textinhalts befasst.

Das folgende Bild zeigt das aktuelle Design meiner Test-App. Liste kommt von Facebook (Liste meiner Freunde) und enthält englische und persische Namen.

enter image description here

Meine Lösung ist, die zwei Layouts (eine für LTR und eine für RTL) in Adapter und jeder auf Richtung Namen basierend zuzuordnen. Also, ich schrieb folgende Zeilen Code:

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

und Ergebnis ist:

enter image description here

I Reihen gespiegelt basierend auf, wenn Zeile gerade oder ungerade ist. Nun ist meine Frage, wie UI basierend auf dem Namen zu spiegeln. Ich denke, ich sollte die Klausel Bedingung von if(position % 2 == 0) zu etwas wie if(isNameLTR(FIRST_CHAR_OF_NAME)) ändern. Ich habe keine Ahnung, wie ich diese Methode implementieren soll.

Wie kann ich wissen, ein Zeichen ist LTR oder RTL? (Ich denke, Android weiß, dass das erste Zeichen des Wortes RTL oder LTR ist, deshalb wird, wenn die Breite der Textanzeige übereinstimmt, der Text nach rechts ausgerichtet, wenn das Zeichen RLT ist, und nach links, wenn das Zeichen LTR ist).

Jeder Vorschlag oder Kommentare würden geschätzt. Dank

Antwort

22

Lösung war erleichtert, dass ich :) Dank JAVA

Es ist Bidi Klasse dachte. Diese Klasse hat getBaseLevel() method, die 0 zurückgibt, wenn Ihr Text von links nach rechts ist, andernfalls 1 (wenn von rechts nach links).

Also, das ist mein Code:

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

... 

und Ergebnis ist:

enter image description here

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

-Update:

Es gibt eine andere Methode, baseIsLeftToRight(), die besser in if-Anweisung verwendet werden könnte. Das Ergebnis war das gleiche wie oben.

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

Verwendung textAlignment mit gravity alle Texte RECHTS oder LINKS

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

zu erhalten, wenn der Text in einem TextView ist, dann alles, was Sie tun müssen, um

android:textDirection="anyRtl" 
ist

RTL zu erzwingen. Siehe die anderen Optionen für Ihre Anforderungen.

Es kann Fälle geben, in denen gemischtsprachiger Text nicht in einer TextView angezeigt werden soll. Zum Beispiel kann der Text in einer Freigabe Intent an Gmail oder WhatsApp und so weiter weitergegeben werden. In solchen Fällen müssen Sie eine Kombination der folgenden Klassen verwenden:

Wie in der Dokumentation angegeben, das sind ...

Utility-Klasse [es] zum Formatieren von Text zur Anzeige in einem Kontext mit möglicherweise entgegengesetzter Ausrichtung, ohne zu verstopfen. Die Direktionalität des Kontextes wird bei der Formatiererstellung festgelegt, und die Richtung des Textes kann entweder geschätzt oder weitergegeben werden, wenn er bekannt ist.

So zum Beispiel, dass Sie ein String haben, die eine Kombination aus Englisch & Arabisch hat, und Sie müssen den Text

  • von rechts nach links (RTL) sein.
  • immer rechtsbündig, auch wenn der Satz mit Englisch beginnt.
  • Englisch & Arabische Wörter in der richtigen Reihenfolge und ohne Verstümmelung.

dann könnte man dies mit der unicodeWrap() Methode erreichen Sie wie folgt vor:

String mixedLanguageText = ... // mixed-language text 

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

die Zeichenfolge in RTL Dies würde konvertieren und nach links ausrichten, wenn auch nur eine RTL-Sprache Zeichen in der Zeichenfolge war und andernfalls auf LTR zurückgreifen. Wenn Sie möchten, dass die Zeichenfolge RTL ist, selbst wenn sie vollständig ist, z. B. Englisch (eine LTR-Sprache), können Sie TextDirectionHeuristics.RTL anstelle von TextDirectionHeuristics.ANYRTL_LTR verwenden.

Dies ist die richtige Methode zur Verarbeitung von Text in gemischter Richtung in Abwesenheit von TextView. Interessanterweise, wie die Dokumentation wird,

bemerken auch, dass diese Richtung Heuristiken auf die gleichen Arten von Konstanten in der View Klasse bereitgestellt entsprechen, für setTextDirection() wie TEXT_DIRECTION_RTL.

Weitere Referenzen:

1.Write text file mix between arabic and english.

2.Unicode Bidirectional Algorithm.

Verwandte Themen