Android-Lokalisierungsproblem: Nicht alle Elemente im Layout-Update ordnungsgemäß beim Umschalten von Locales

Hier ist das Problem: Wenn ich eine Aktivität im Hintergrund habe und ich schreibe Locales, und ich schalte wieder auf die Anwendung, alles Updates … EXCEPT Checkboxen und Radio-Buttons, die ein "android: id" Attribut gesetzt haben.

Wenn die Kontrollkästchen und Optionsfelder nicht über das Attribut "android: id" verfügen, dann aktualisieren sie OK. Andere Felder haben dieses Problem nicht, ob sie ein "android: id" Attribut haben oder nicht.

Was ist der beste Weg, um sicherzustellen, dass alles in meiner laufenden Aktivität aktualisiert wird, wenn das Gebietsschema geändert wird?

Schritte zum Reproduzieren:

1) Erstellen Sie ein "Hallo, Android" -Projekt in Eclipse. 2) Im Hauptlayout definieren Sie zwei Checkboxen:

<CheckBox android:text="@string/checkbox" android:id="@+id/CheckBox01" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox> <CheckBox android:text="@string/checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox> 

3) Erstellen Sie zwei Strings.xml: eine unter "Werte" und eine unter "values-es".

4) Erstellen Sie den folgenden String unter "Werte":

 <string name="checkbox">English</string> 

5) Erstellen Sie den folgenden String unter "values-es"

 <string name="checkbox">español</string> 

6) Gerät auf "Englisch" setzen

7) Führen Sie die Anwendung auf dem Emulator oder einem Gerät aus (getestet auf HTC G1).

8) Beobachten. Beide Kontrollkästchen sagen "Englisch".

9) Drücken Sie "Home", um zum Menü zurückzukehren und lassen Sie die Anwendung im Hintergrund laufen.

10) Gehen Sie zu den Einstellungen. Umschalten der Sprache auf "español"

11) Halten Sie "Home" gedrückt. Rückkehr zur Bewerbung.

Erwartetes Ergebnis:

Beide Checkboxen sagen "español"

Tatsächliche Ergebnis:

Erstes Kontrollkästchen sagt "Englisch"

Zweite Checkbox sagt "español"

Es scheint, dass das Kontrollkästchen mit einem "android: id" Attribut nicht aktualisiert wird, wie es sollte. Das Kontrollkästchen ohne das Attribut "android: id" funktioniert wie erwartet.

  • Android lokalisieren es-r419
  • Ändern Sie das Gebietsschema zur Laufzeit?
  • Force locale für Android-Geschmack mit resConfig
  • SharedPrefs wird nach dem Einstellen der Gebietsschema der Android-Anwendung zurückgesetzt
  • Jede kollaborative Tool / Website, um eine Android App zu lokalisieren?
  • Wie finde ich die Verwendung von Strings.xml in Android Studio?
  • Lokalisierung von Assets-Dateien
  • Google.Play web interface hl Parameter für arabische Sprache
  • 4 Solutions collect form web for “Android-Lokalisierungsproblem: Nicht alle Elemente im Layout-Update ordnungsgemäß beim Umschalten von Locales”

    Die Ursache des Problems besteht darin, dass CompoundButton.onSaveInstanceState() setFreezesText(true) und somit den Text speichert und wiederherstellt.

    Eine einfache Lösung ist die Verwendung einer Unterklasse wie folgt:

     public class CheckBoxNoPersistentText extends CheckBox { public CheckBoxNoPersistentText(final Context context) { super(context); } public CheckBoxNoPersistentText(final Context context, final AttributeSet attrs) { super(context, attrs); } public CheckBoxNoPersistentText(final Context context, final AttributeSet attrs, final int defStyle) { super(context, attrs, defStyle); } @Override public void onRestoreInstanceState(final Parcelable state) { final CharSequence text = getText(); // the text has been resolved anew super.onRestoreInstanceState(state); // this restores the old text setText(text); // this overwrites the restored text with the newly resolved text } } 

    Das ist ein faszinierender Bug. Ich kann es auf meinem Nexus One reproduzieren.

    Es scheint in der Standardimplementierung von onSaveInstanceState() . Wenn du das überschreibst, um ein No-op zu sein (kette nicht an die Superklasse), geht das Problem weg

    Die Voreinstellung onSaveInstanceState() soll Sachen wie den Checkbox-Status behandeln, aber sie müssen das verpfuscht haben und auch den Text speichern.

    So haben Sie ein paar Workarounds:

    1. Override onSaveInstanceState() und kette nicht an die Superklasse. Dies beseitigt jedoch jegliche automatische staatliche Einsparung, die Sie normalerweise bekommen würden.
    2. In onRestoreInstanceState() (… denke ich …), nach der Verkettung auf die Superklasse, setText() auf deine betroffenen Widgets mit der richtigen String-Ressource auf, um sie wieder auf den richtigen Wert zurückzusetzen.

    Ich werde versuchen, dies noch morgen zu verfolgen, wenn ich eine Chance bekomme. Ich möchte den Quellcode überprüfen und ihn wahrscheinlich als Problem anmelden.

    Wenn einige von ihnen im Gedächtnis sind, werden sie sich nicht ändern. Wenn Sie das Telefon neu starten, installieren Sie die Anwendung neu oder zumindest vollständig töten die App wird es gut funktionieren.

    Diese 2 Jahre alte Ticket schlägt eine Problemumgehung der nicht mit dem Android: id so habe ich dieses Problem mit einem ähnlichen Layout:

     <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"> <!-- KEEP THIS ALWAYS THE FIRST because it dosen't have an android:id as a workaround of this bug https://code.google.com/p/android/issues/detail?id=13252 --> <RadioButton xmlns:android="http://schemas.android.com/apk/res/android" /> <!-- other elements --> </RelativeLayout> 

    Also jetzt, um die RadioButton zu bekommen, benutze ich so etwas wie:

     private RadioButton getButton(RelativeLayout layout) { RadioButton button = null; if (layout.getChildCount() != 0) { button = (RadioButton) layout.getChildAt(0); } return button; } 

    So kann ich die Eigenschaften programmgesteuert einstellen.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.