2017-08-16 54 views
0

我已经在我的android应用程序中实现了设置屏幕,有一个ListPreference允许用户选择语言。选择列表中的项目时,它可以正常工作,重新创建活动并自动翻译文字,但当按下取消按钮时,如果用户试图再次更改语言,效果将不可见,但当设置屏幕已关闭,文字已完美翻译。ListPreference取消按钮怪异behaviour

这是我SettingsActivity与我使用的内部类建模塔片段:

public class SettingsActivity extends PreferenceActivity { 

    /** Preferences fields */ 
    private static final String PREF_LANGUAGE = "pref_language"; 

    /** 
    * Method called when the application is been started 
    * 
    * @param savedInstanceState the saved instance state 
    */ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     final String PREF_LANGUAGE = "pref_language"; 

     super.onCreate(savedInstanceState); 

     SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); 

     String language = "en"; 
     if (Locale.getDefault().getLanguage().equals("es")) { 
      language = "es"; 
     } 
     String languagePref = settings.getString(PREF_LANGUAGE, language); 
     Locale locale = new Locale(languagePref); 
     Locale.setDefault(locale); 
     Configuration config = new Configuration(); 
     config.locale = locale; 
     getResources().updateConfiguration(config, getResources().getDisplayMetrics()); 
     setContentView(R.layout.settings_activity); 

     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
     SharedPreferences.OnSharedPreferenceChangeListener prefListener = new SharedPreferences.OnSharedPreferenceChangeListener() { 

      /** 
      * Method triggered when a shared preference changes 
      * 
      * @param sharedPreferences is the object which represents the shared preferences 
      * @param key is the key of the preference changed 
      */ 
      @Override 
      public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
       switch (key) { 
        case PREF_LANGUAGE: 
         Locale locale = new Locale(sharedPreferences.getString(key, "")); 
         Locale.setDefault(locale); 
         Configuration config = new Configuration(); 
         config.locale = locale; 
         getResources().updateConfiguration(config, getResources().getDisplayMetrics()); 
         recreate(); 
         break; 
       } 
      } 
     }; 

     prefs.registerOnSharedPreferenceChangeListener(prefListener); 
    } 

    /** 
    * Class which represents the fragment for the settings screen 
    */ 
    public static class GeograppPreferenceFragment extends PreferenceFragment { 

     /** 
     * Method triggered when the fragment is created 
     * 
     * @param savedInstanceState is the state of the fragment 
     */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(settings); 
      SharedPreferences settings = getPreferenceManager().getSharedPreferences(); 

      String language = "en"; 
      if (Locale.getDefault().getLanguage().equals("es")) { 
       language = "es"; 
      } 
      String languagePref = settings.getString(PREF_LANGUAGE, language); 
      getPreferenceManager().findPreference(PREF_LANGUAGE).setDefaultValue(languagePref); 
     } 
    } 
} 

偏好XML是:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <PreferenceCategory 
     android:title="@string/settings_display" /> 

     <ListPreference 
      android:key="pref_language" 
      android:title="@string/settings_language_title" 
      android:summary="@string/settings_language_summary" 
      android:entries="@array/language_options" 
      android:entryValues="@array/language_values" /> 

</PreferenceScreen> 

回答

0

最后我可以定义个人监听到的偏好与指令setOnPreferenceChangeListener并在OnCreate方法

0

很难理解你的问题,但我想使用的onResume( )函数可以帮助你在某个地方。当你离开你的设置屏幕时,onResume()函数将被调用,这就是你可以立即更新语言的地方。

+0

删除OnSharedPreferenceChangeListener解决这个问题,但我希望看到变化的影响,而无需离开设定画面。当我不按下ListPreference对话框的取消按钮时它工作正常,但是当我按下一次时,它不再起作用,直到我离开设置屏幕并再次打开它 –