4 Stimmen

Vollständiges Anhalten oder Neustarten aller Aktivitäten in einer Android-App, um die neue Sprachwahl zu berücksichtigen

Ich arbeite an einer Android-App, die zweisprachig sein muss (Englisch/Spanisch). Ich erlaube dem Benutzer, die gewünschte Sprache aus einer Einstellung auszuwählen und die folgende Gebietsschemaänderung in der Hauptaktivität der App (einer Unterklasse von TabActivity) basierend auf der ausgewählten Sprache durchzuführen:

private void setApplicationLanguage(String languageCode)
{
    // Set the locale to the specified language code.
    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    android.content.res.Configuration conf = res.getConfiguration();
    conf.locale = new Locale(languageCode.toLowerCase());
    res.updateConfiguration(conf, dm);
}

Die Hauptaktivität enthält vier Registerkarten, jede mit einer eigenen Aktivität (manchmal ActivityGroup). Was ich gerne hätte, ist, wenn sich die Sprache ändert, alle Offene Aktivitäten werden einfach neu gestartet, wodurch ihre Zeichenketten in der entsprechenden Sprache neu geladen werden. Ebenfalls akzeptabel (aber weniger wünschenswert) wäre die vollständige Zerstörung aller geöffneten Aktivitäten, so dass der Benutzer die Anwendung manuell neu starten müsste und somit alle Zeichenfolgen in der entsprechenden Sprache neu geladen würden.

Ich habe versucht anzurufen finish() von der Haupttätigkeit, was dazu führt, dass diese Tätigkeit beendet wird. Wenn ich jedoch die Anwendung neu starte, erscheinen die untergeordneten Aktivitäten, die von der Hauptaktivität "gehostet" werden (eine für jede Registerkarte), weiterhin in der vorherigen Sprache. Ich nehme an, dass dies darauf zurückzuführen ist, dass die untergeordneten Aktivitäten nicht rekursiv für mich "beendet" wurden.

Ich habe auch versucht, das "locale"-Attribut aus AndroidManifest.xml in der Hauptaktivität sowie in anderen Aktivitäten ein- und auszuschließen, aber ich sehe nie, dass eine Aktivität bei einer Änderung der Locale neu startet. Andererseits, wie würde sich der "Neustart" manifestieren? Würde er Folgendes aufrufen onCreate() oder einfach onResume() oder sogar etwas anderes? Wenn dieser Ansatz die Aktivitäten automatisch neu starten würde, würde der Aufruf onCreate() wenn sich das Gebietsschema ändert, dann wäre es in meinem Fall wohl am besten, wenn ich eine genaue Anleitung bekäme, wie ich dies erreichen kann.

Die Lösung muss auf Android API Level 7 laufen, also muss eine neue Intent mit der Flagge FLAG_ACTIVITY_CLEAR_TASK ist anscheinend keine Option verfügbar.

1voto

Squonk Punkte 48341

Sie können eine BroadcastReceiver als eine innere Klasse von jeder Activity für den Inhalt der Registerkarte verwendet.

Registrieren Sie den Empfänger in onResume und heben Sie die Registrierung in onPause .

Lassen Sie die wichtigsten Activity einen "sticky" Broadcast senden, wenn das Gebietsschema geändert wird, und das Ergebnis der registerReceiver en onResume zum Abrufen der Intent um festzustellen, ob sich das Gebietsschema geändert hat. Dies sollte auch für alle "sichtbaren Activity damit es die Daten dynamisch aktualisieren kann.

0voto

mharper Punkte 3112

Ich habe eine LocalBroadcastManager um die interessierten Parteien über den Ortswechsel zu informieren. Das Problem war, dass ich nicht alles aktualisieren konnte, was ich wollte, z. B. die Beschriftungen der Registerkarten. Es stellte sich heraus, dass das Folgende in der "Haupt"-Aktivität (Registerkarte) am besten funktioniert:

    Intent intent = new Intent(mainActivity.getApplicationContext(), MainTabActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    mainActivity.startActivity(intent);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X