2013-09-24 4 views
6

Wie implementiere ich die Sprachumschaltung, ohne das Gebietsschema in einer Android App manuell einstellen zu müssen? Ich weiß, dass die App die strings.xml entsprechend der Ländereinstellung während des Starts lädt, aber ich möchte nicht, dass diese Wahl auf der Grundlage des Gebietsschemas des Systems getroffen wird, sondern in den Einstellungen benutzerdefiniert ist.Sprachumschaltung innerhalb der App Android

Oder, ist die Einstellung Locale in Ordnung?

+0

Können Sie mehr klar sein, gespeichert bitte? Sie möchten, dass sich die Sprache basierend auf den App-Einstellungen und nicht in den Ländereinstellungen des Geräts ändert? –

+0

Ja, ich möchte, dass sich die App-Sprache basierend auf den App-Einstellungen ändert. –

Antwort

18

Sie können die Application-Klasse erweitern (Sie müssen sie auch im Manifest deklarieren) und etwas in diese einfügen.

Wenn Sie die Sprache ändern möchten, können Sie rufen Sie dann

((App)getApplicationContext()).changeLang(lang); 

aus Ihrer Tätigkeit. R.string.locale_lang ist nur ein Schlüssel, der in strings.xml für die gemeinsame Vorlieben

public class App extends Application { 

    private Locale locale = null; 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     if (locale != null) { 
      Locale.setDefault(locale); 
      Configuration config = new Configuration(newConfig); 
      config.locale = locale; 
      getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 
     } 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); 
     String lang = settings.getString(getString(R.string.locale_lang), ""); 
     changeLang(lang); 
    } 

    public void changeLang(String lang) { 
     Configuration config = getBaseContext().getResources().getConfiguration(); 
     if (!"".equals(lang) && !config.locale.getLanguage().equals(lang)) { 

      Editor ed = PreferenceManager.getDefaultSharedPreferences(this).edit(); 
      ed.putString(getString(R.string.locale_lang), lang); 
      ed.commit(); 

      locale = new Locale(lang); 
      Locale.setDefault(locale); 
      Configuration conf = new Configuration(config); 
      conf.locale = locale; 
      getBaseContext().getResources().updateConfiguration(conf, getBaseContext().getResources().getDisplayMetrics()); 
     } 
    } 

    public String getLang(){ 
     return PreferenceManager.getDefaultSharedPreferences(this).getString(this.getString(R.string.locale_lang), ""); 
    } 



} 
+0

Danke. Ich habe die Idee. Aber, wie deklariere ich es im Manifest? nicht als Aktivität, denke ich. –

+1

Nein, nicht als eine Aktivität, aber Sie haben ein Anwendungs-Tag, das Aktivitäts-Tags enthält. Als ein Attribut für die Anwendung müssen Sie Android hinzufügen: name = ". App" – kjurkovic