2

Ich folge Android N change language programmatically zu geänderten Sprache meiner App in Android N und höher. Ich habe jedoch immer noch das Problem mit der Anwendungskontext-Instanz.Android: Sprache ändern android N, Anwendungsinstanz nicht aktualisiert

In meiner Anwendungsklasse:

private static Application mInstance; 

public static Context getApplication() { 
    return mInstance; 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 

    mInstance = this; 
} 

Die Sprache verändert wird, sondern Ressourcen erhalten aus dem Anwendungskontext nicht geändert wird. Zum Beispiel:

MyApplication.getApplication().getResources().getString(stringId); 

Mit der falschen Sprachzeichenfolge zurückgegeben.

Kann ich die Anwendungsinstanz in dieser Situation aktualisieren? Ich blieb mehrere Stunden bei diesem Problem. Weil die MyApplication.getApplication() an vielen Stellen in meiner App verwendet wurde. Daher kann ich nicht in den Aktivitätskontext konvertieren.

Vielen Dank.

+0

Versuchen Sie, onCreate for Application erneut aufzurufen, wenn eine Sprachänderung durchgeführt wird. 'MyApplication.getApplication(). OnCreate()'. Alternativ können Sie versuchen, die App bei einer Sprachänderung neu zu starten, die den Kontext festlegen sollte. – jitinsharma

+0

haben Sie Ihre ** 'MyApplication' ** unter **' application' ** in der Manifestdatei hinzugefügt –

Antwort

0

Ich habe das gleiche Problem mit einer meiner Apps, weil ich meine Manager und Dienstprogramme liebe, die nicht erfordert, dass der Kontext jedes Mal übergeben wird.

Meine Lösung beinhaltet zwei separate Kontexte, einen Anwendungskontext und einen Gebietskontext. Dies löst nicht alle Probleme, wie das Aufblasen mit dem richtigen Gebietsschema unter Verwendung des richtigen Stils, dafür müssen Sie den Aktivitätskontext verwenden. Wenn Sie jedoch die richtige Zeichenfolge oder das richtige Bild aus den Ressourcen basierend auf dem aktuellen Gebietsschema abrufen müssen, funktioniert diese Lösung.

public class MainApplication extends Application { 
    private static Context applicationContext; 
    private static Context localeContext; 

    public static Context getAppContext() { 
     return applicationContext; 
    } 

    public static Context getLocaleContext() { 
     return localeContext; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     setTheme(R.style.AppTheme); 
     applicationContext = getApplicationContext(); 
     updateLocaleContext(); 
    } 

    public static void updateLocaleContext() { 
     localeContext = LocaleHelper.wrapContext(applicationContext); 
    } 
} 

Die LocaleHelper.wrapContext sollte eine ähnliche Lösung wie die akzeptierte Antwort auf Android N change language programmatically und alle Aktivitäten müssen verwenden attachBaseContext implementiert. Jedes Mal, wenn sich die Sprache ändert, muss MainApplication.updateLocaleContext aufgerufen werden. Hinweis: Die localeContext nicht behalten den Stil festgelegt in der onCreate Funktion

Jetzt können Sie die MainApplication.getLocaleContext() verwenden, um Ressourcen, die auf korrekte locale abhängig ist, bei der Verwendung von MainApplication.getAppContext() für zB Aufblasen Ansichten, die nicht vom Gebietsschema abhängen. Hinweis: Sie können localeContext auch in LocaleHelper platzieren, um die Kopplung zu reduzieren.