2016-04-28 2 views
3

Ich möchte eine Anwendung schreiben, die entweder Englisch oder Chinesisch anzeigen kann. Ich habe bereits 2 string.xml vorbereitet, das ist value/strings.xml und value-zh-rHK/strings.xml. Aber ich habe keine Idee, wie man die Sprache über ListPreference von Android ändert.Wie ändere ich die Sprache für eine ganze Android-Anwendung?

xml/preferences.xml:

<?xml version="1.0" encoding="utf-8"?> 

<SwitchPreference 
    android:key="pref_nightmode" 
    android:title="@string/nightmode" 
    android:defaultValue="false"> 
</SwitchPreference> 

<ListPreference 
    android:key="pref_lang" 
    android:title="@string/lang" 
    android:dialogTitle="Choose Language" 
    android:entries="@array/lang" 
    android:entryValues="@array/lang_value" 
    android:defaultValue="@string/lang_default"> 
</ListPreference> 

und die Preferences.java

public class Preferences extends BaseActivity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setTitle(drawer_menu[5]); 
    getFragmentManager().beginTransaction().replace(R.id.content_frame, new MainPreferenceFragment()).commit(); 
} 

public static class MainPreferenceFragment extends PreferenceFragment { 
    String locale; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 
     PreferenceManager pm = getPreferenceManager(); 
     ListPreference lang = (ListPreference) pm.findPreference("pref_lang"); 
     if(lang.getValue().equals("English")) { 
      locale = "en_US"; 
     } else { 
      locale = "zh_HK"; 
     } 
    } 
} 

Die Aktivität erstreckt BaseActivity, weil ich eine Schublade Menü haben genau da.

+0

Die Sprache kann in den Android-Einstellungen systemweit geändert werden. – Robert

+1

Ich möchte nur die Sprache der Anwendung ändern, nicht mein Telefon – rascee

Antwort

10

Sie können die Spracheinstellungen nur für die App ändern. Verwenden Sie die Locale-Klasse und aktualisieren Sie die Standardkonfiguration. Sprachänderung wird nur angewendet, wenn die Anwendung neu gestartet oder neu gestartet wird. Verwenden Sie folgende locale Klasse

public class LocaleUtils { 

    private static Locale sLocale; 

    public static void setLocale(Locale locale) { 
     sLocale = locale; 
     if(sLocale != null) { 
      Locale.setDefault(sLocale); 
     } 
    } 

    public static void updateConfig(ContextThemeWrapper wrapper) { 
     if(sLocale != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
      Configuration configuration = new Configuration(); 
      configuration.setLocale(sLocale); 
      wrapper.applyOverrideConfiguration(configuration); 
     } 
    } 

    public static void updateConfig(Application app, Configuration configuration) { 
     if(sLocale != null && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { 
      //Wrapping the configuration to avoid Activity endless loop 
      Configuration config = new Configuration(configuration); 
      config.locale = sLocale; 
      Resources res = app.getBaseContext().getResources(); 
      res.updateConfiguration(config, res.getDisplayMetrics()); 
     } 
    } 
} 

Anwendungsklasse:

public class App extends Application { 
    public void onCreate(){ 
     super.onCreate(); 
     // get user preferred language set locale accordingly new locale(language,country) 
     LocaleUtils.setLocale(new Locale("iw")); 
     LocaleUtils.updateConfig(this, getBaseContext().getResources().getConfiguration()); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     LocaleUtils.updateConfig(this, newConfig); 
    } 
} 

BaseActivity:

public class BaseActivity extends Activity { 
    public BaseActivity() { 
     LocaleUtils.updateConfig(this); 
    } 
} 

Above Antwort ist entnommen aus: Changing Locale within the app itself

Android Dokument: http://developer.android.com/reference/java/util/Locale.html

+0

Das bedeutet, ich brauche dies nicht vorziehen? Ich kann in normaler Klasse programmieren, aber die obige Methode verwenden? – rascee

+0

Sie sollten Präferenz verwenden, um Benutzereinstellungen zu speichern. Holen Sie sich den Wert aus der Präferenz und aktualisieren Sie das Gebietsschema entsprechend der Anwendungsklasse. – USKMobility

+0

nach setLocale Wie aktualisiert man die Ansicht? – WolfJee

Verwandte Themen