Ich möchte, dass meine App drei Sprachen unterstützt: Spanisch, Portugiesisch und Englisch. Und geben Sie die Option, Sprache in App auszuwählen. Ich habe gemacht
1) 3 zeichnbare Ordner drawable-es, drawable-pt, drawable.
2) 3 Werte Ordnerwerte-es, Werte-pt, Werte. Ändern Sie die String.xml-Werte nach Sprachen.
Ich habe imageView, um die Sprache auszuwählen. Wenn Sie darauf klicken, öffnen Sie das Menü, das aus der Option Englisch, Spanisch, Portugiesisch besteht.
Ich habe das Gebietsschema in der App bei der Auswahl der Optionen anhand dieses Codes festgelegt
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.en:
Locale locale = new Locale("en");
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
Toast.makeText(this, "Locale in English !", Toast.LENGTH_LONG).show();
break;
case R.id.pt:
Locale locale2 = new Locale("pt");
Locale.setDefault(locale2);
Configuration config2 = new Configuration();
config2.locale = locale2;
getBaseContext().getResources().updateConfiguration(config2, getBaseContext().getResources().getDisplayMetrics());
Toast.makeText(this, "Locale in Portugal !", Toast.LENGTH_LONG).show();
break;
case R.id.es:
Locale locale3 = new Locale("es");
Locale.setDefault(locale3);
Configuration config3 = new Configuration();
config3.locale = locale3;
getBaseContext().getResources().updateConfiguration(config3, getBaseContext().getResources().getDisplayMetrics());
Toast.makeText(this, "Locale in Spain !", Toast.LENGTH_LONG).show();
break;
}
return super.onOptionsItemSelected(item);
}
Ich habe in Manifest- Android deklariert : configChanges = "locale"
Es funktioniert, aber es gibt ein Problem.
Problem:-
1) Wenn die Sprache ausgewählt ist, ändert sich der Bildschirm, der aus dem Bild der Sprachauswahl besteht, nicht, aber andere Bildschirme ändern sich.
2) Nach dem Ausrichten ändern Sie die App-Wiederherstellungssprache entsprechend dem Gebietsschema des Telefons.
quelle
android:configChanges="locale"
für Ihre Aktivität in der AndroidManifest.xmlAntworten:
Es ist ein Auszug für die Webseite: http://android.programmerguru.com/android-localization-at-runtime/
Es ist einfach, die Sprache Ihrer App zu ändern, wenn der Benutzer sie aus der Liste der Sprachen auswählt. Verwenden Sie eine Methode wie die folgende, die das Gebietsschema als Zeichenfolge akzeptiert (z. B. 'en' für Englisch, 'hi' für Hindi), konfigurieren Sie das Gebietsschema für Ihre App und aktualisieren Sie Ihre aktuelle Aktivität, um die Änderung der Sprache widerzuspiegeln. Das von Ihnen angewendete Gebietsschema wird erst geändert, wenn Sie es erneut manuell ändern.
Stellen Sie sicher, dass Sie folgende Pakete importiert haben:
In Manifest zur Aktivität hinzufügen Android: configChanges = "Gebietsschema | Orientierung"
quelle
finish()
muss vorher angerufen werdenstartActivity(refresh)
. Andernfalls wird die App möglicherweise beendet, anstatt dass die Aktivität neu gestartet wird.Gute Lösungen werden hier ziemlich gut erklärt. Aber hier ist noch einer.
Erstellen Sie eine eigene
CustomContextWrapper
KlassenerweiterungContextWrapper
und ändern Sie damit die Gebietsschemaeinstellung für die gesamte Anwendung. Hier ist ein GIST mit Verwendung.Rufen Sie dann die
CustomContextWrapper
mit gespeicherte Gebietsschema-ID auf, z. B.'hi'
für die Hindi-Sprache in der AktivitätslebenszyklusmethodeattachBaseContext
. Verwendung hier:quelle
MyContextWrapper.warp
InonAttach
von nur einem Fragment meiner App aufgerufen, aber die Sprache wurde für die gesamte App geändert, aber die Aktivitätstitel wurden nicht geändert, glaube ich Das liegt daran, dass die Manifesttitel Vorrang haben, aber wenn ich dieselbe Methode inonAttachBaseContex
meiner Unterklasse der Anwendung aufrufe, ändern sich die Aktivitätstitel auch in die ausgewählte Sprache, aber dann werden die Änderungen nur auf das Fragment angewendet, das ich in der Warp-Methode aufgerufen habe. Warum ist das so? ?warp
Methode inonAttach
dem Fragment. Zuvor habe ich gesagt, ich muss sie nur mit dem Hauptaktivitätsfragment und der geänderten Sprache ausführen Die gesamte App ist wahr, aber für alle anderen Fragmente ändert sich die Sprache bei Konfigurationsänderungen in Englisch, sodass ichonattach
alle Fragmente einfügen muss. Statt zu manifestieren, setze ich die Titel der Aktionsleiste in Code. Jetzt funktioniert die App wie erwartet. dankeattachBaseContext
nur für die Funktion. Und das für alle Bildschirme. Haben Sie eine "BaseActivity" für alle Aktivitäten in Ihrer App erstellt?wrap()
Code bei jeder Konfigurationsänderung ausgeführt werden muss, also habe ich ihn in die Abstrakte Aktivität, von der sich alle anderen Aktivitäten erstrecken, jetzt funktioniert sieSie sollten entweder
android:configChanges="locale"
aus dem Manifest entfernen , wodurch die Aktivität neu geladen wird, oder dieonConfigurationChanged
Methode überschreiben :quelle
Der gesamte obige Code ist perfekt, aber nur einer, der fehlt, funktionierte nicht, nur weil die Sprache in der Konfigurationsdatei nicht erwähnt wurde
Danach wurden alle Sprachen ausgeführt
quelle
Diejenigen, die das Versionsproblem bekommen, versuchen diesen Code.
quelle
Udhays Beispielcode funktioniert gut. Mit Ausnahme der Frage von Sofiane Hassaini und Chirag SolankI, für den Wiedereintritt, funktioniert es nicht. Ich versuche, Udhays Code aufzurufen, ohne die Aktivität in onCreate () vor super.onCreate (savedInstanceState); neu zu starten. Dann ist es OK! Nur ein kleines Problem, die Menüzeichenfolgen wurden immer noch nicht in das eingestellte Gebietsschema geändert.
quelle
Intent refresh = new Intent(this, ThisActivity.class); startActivity(refresh);
?