2016-05-10 23 views
3

Ich habe eine mehrsprachige App geschrieben.Warum erkennt Android das Gebietsschema nicht als RTL, wenn es programmgesteuert eingestellt ist?

Ich habe verschiedene values Ordner für verschiedene Sprachen wie values-fa und values-ru. Da einige dieser Sprachen wie Farsi und Arabisch RTL sind, verwendete ich ein anderes Layout-Design, indem ich ein anderes Layout .xml Dateien in einen Ordner layout-ldrtl neben dem Hauptordner layout legte.

Ich habe auch eine Datei is_right_to_left.xml int einen Ordner mit dem Namen values-ldrtl benannt, die eine Variable wie folgt definiert:

<bool name="is_right_to_left">true</bool> 

Ich habe die gleiche Datei in values Ordner und legen Sie den Variablenwert false dort.

Immer dann, wenn in dem Code, den ich wissen muss, verwende ich diese Linie zu verstehen, wenn die aktuellen locale ein RTL ist oder nicht:

isRightToLeft = context.getResources().getBoolean(R.bool.is_right_to_left); 

ich die App mit verschiedenen Geräte configs getestet haben und alles funktioniert wie Charme. Zum Beispiel bewirkt das Einstellen der Gerätesprache auf Farsi, dass die App die Zeichenfolgen von values-fa und die Layouts von layout-ldrtl liest. Wenn Arabisch für Gerät eingestellt ist, werden Werte von values-ar gelesen und die Layouts werden auch von layout-ldrtl gelesen, da beide RTL-Sprachen sind . Es funktioniert natürlich auch für LTR-Sprachen. Das ist, was ich will.

Das Problem tritt auf, wenn ich das Gebietsschema der App programmgesteuert festlegen. Dies ist der Code, den ich in onCreate() Methode meiner MainActivity schrieb:

Locale myLocale = new Locale("fa"); 
Resources res = getResources(); 
DisplayMetrics dm = res.getDisplayMetrics(); 
Configuration conf = res.getConfiguration(); 
conf.locale = myLocale; 
res.updateConfiguration(conf, dm); 

Nun werden die Werte korrekt nach der Sprache zu lesen, aber layout-ldrtl und values-ldrtl nie lesen. Also, die App würde in LTR-Design wegen falscher .xml Dateien und falschen Wert von isRightToLeft Variable laden. Eine Lösung, die ich getestet habe, ist diese .xml Dateien in jedem Sprachlayout-Ordner separat zu setzen, und es funktioniert. Aber ich hoffe, dass ich das Problem besser und besser lösen kann. Und neben der Lösung, warum funktioniert Androide auf diese Weise?

+0

Sie benötigen diese programmatisch zu tun, oder testen Sie einfach Ihre Anwendung? Wenn das letztere, überprüfen Sie http://lifehacker.com/enable-androids-secret-right-to-left-layout-if-youre-le-1676267178 – petey

+0

@petey Ich muss es programmgesteuert tun. Ein Fall ist, den Benutzer die Sprache der App wählen zu lassen. Danke für die Antwort. – EmJiHash

Antwort

3

versuchen Sie dies:

Resources res = getResources(); 
Configuration newConfig = new Configuration(res.getConfiguration()); 
Locale locale = new Locale("fa"); 
Locale.setDefault(locale); 
newConfig.locale = locale; 
newConfig.setLayoutDirection(locale); 
res.updateConfiguration(newConfig, null); 
+0

Danke, es ist eine gute Antwort und es funktioniert, aber nur für API 17+. Eigentlich habe ich den ganzen Zwei-Layout-Ordner für minus 17 API-Unterstützung gemacht. – EmJiHash

+0

Ich wählte die Antwort, aber nicht als akzeptiert. Warten auf eine Lösung, die auch für frühere APIs funktionieren kann. – EmJiHash