2016-01-20 63 views
0

我的应用程序中有两种语言,英语和荷兰语。在首选项中,您可以更改应用程序重新启动后的语言。但是,当用户第一次打开应用程序时,以下代码中设置的默认语言未被使用(R.xml.user_settings)。它使用设备语言(这是荷兰语是我的情况)。第一次启动时的语言未被设置或使用

<ListPreference 
    android:defaultValue="@string/pref_languages_default" 
    android:entries="@array/languages" 
    android:entryValues="@array/listValues" 
    android:key="language" 
    android:title="@string/languages" /> 

其中 “@字符串/ pref_languages_default”, “@阵列/语言”,并 “@阵列/ listValues” 是:

<string translatable="false" name="pref_languages_default">en</string> 
<string-array name="languages"> 
    <item name="nl">Dutch</item> 
    <item name="en">English</item> 
</string-array> 
<string-array name="listValues"> 
    <item name="nl">nl</item> 
    <item name="en">en</item> 
</string-array> 

在MyApplication.java我有以下代码:

public class MyApplication extends Application { 
    private Locale locale = null; 

    @Override 
    public void onCreate() { 
     PreferenceManager.setDefaultValues(this, R.xml.user_settings, false); 

     super.onCreate(); 

     SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); 
     Configuration config = getBaseContext().getResources().getConfiguration(); 

     String lang = settings.getString("LANG", ""); 
     if (!"".equals(lang) && !config.locale.getLanguage().equals(lang)) { 
      locale = new Locale(lang); 
      Locale.setDefault(locale); 
      config.locale = locale; 
      getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 
     } 
    } 
} 

而且在SettingsFragment.java代码(在那里我可以选择语言):

public class SettingsFragment extends PreferenceFragment { 
    Locale myLocale; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.user_settings); 

     ListPreference langPref = (ListPreference) findPreference("language"); 
     langPref.setSummary(langPref.getEntry()); 

     langPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 
      @Override 
      public boolean onPreferenceChange(Preference preference, Object o) { 
       preference.setSummary(o.toString()); 
       return true; 
      } 
     }); 

     ListPreference langPreference = (ListPreference) findPreference("language"); 
     langPreference.setOnPreferenceChangeListener(languageChangeListener); 
    } 

    Preference.OnPreferenceChangeListener languageChangeListener = new Preference.OnPreferenceChangeListener() { 

     @Override 
     public boolean onPreferenceChange(Preference preference, Object newValue) { 

      switch (newValue.toString()) { 
       case "nl": 
        PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()).edit().putString("LANG", "nl").commit(); 
        setLocale("nl"); 
        Toast.makeText(getActivity().getBaseContext(), R.string.save_language_changes, Toast.LENGTH_LONG).show(); 
        break; 
       case "en": 
        PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()).edit().putString("LANG", "en").commit(); 
        setLocale("en"); 
        Toast.makeText(getActivity().getBaseContext(), R.string.save_language_changes, Toast.LENGTH_LONG).show(); 
        break; 
       /*default: 
        PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()).edit().putString("LANG", "en").commit(); 
        setLocale("en"); 
        Toast.makeText(getActivity().getBaseContext(), R.string.save_language_changes, Toast.LENGTH_LONG).show(); 
        break;*/ 
      } 
      return true; 
     } 
    }; 

    public void setLocale(String lang) { 
     myLocale = new Locale(lang); 
     Resources res = getResources(); 
     DisplayMetrics dm = res.getDisplayMetrics(); 
     Configuration conf = res.getConfiguration(); 
     Locale.setDefault(myLocale); 
     conf.locale = myLocale; 
     res.updateConfiguration(conf, dm); 
    } 
} 

事情是,ListPreference摘要正确显示默认语言,但是,默认语言尚未设置。我怎样才能让应用程序显示正确的语言?我有一个正确的字符串值和值的nl目录。

回答

1

在应用程序的SharedPreferences的第一次运行先后为LANG键的值,因此String lang = settings.getString("LANG", "");设置塔lang""行了,你改变只有当lang不是空的地方。

因此,您需要将默认值设置为在应用程序中使用的语言之一。

要做到这一点简单地改变行

String lang = settings.getString("LANG", ""); 

String lang = settings.getString("LANG", "en"); 

String lang = settings.getString("LANG", "nl"); 
+0

感谢您的解决方案! –