在首选项中选择新语言时重新加载PreferenceFragment

时间:2014-09-30 08:38:35

标签: android sharedpreferences android-preferences

在我的应用首选项中,我可以选择更改应用的语言。

public class Fragment_Preferences extends PreferenceFragment {

private SharedPreferences.OnSharedPreferenceChangeListener prefListener;
SharedPreferences preferences;

@Override
public void onCreate(Bundle savedInstanceState) {

    preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());

    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());

    prefListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
        public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
            if(key.equals("language_preference"))
            {
                // Set language change flag to true - 
                // the Main Fragment will be recreate when this fragment finishes and the main restarts
                Common_Methods.set_locale_changed(true);
            }
        }
    };
    prefs.registerOnSharedPreferenceChangeListener(prefListener);
}

}

因此,当我更改语言时,首选项片段不会立即更改它的语言。我必须退出首选项,然后在我的Fragment或Activity中(取决于我调用Preference片段的位置)我有这个代码,它使用新的语言设置重新启动当前片段或活动:

public void onConfigurationChanged(Configuration newConfig) {
    Handler handler = new Handler();
      handler.postDelayed(new Runnable()
      {
        @Override
        public void run()
        {
          if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB)
          {
            finish();
            startActivity(getIntent());
          } else {recreate();}
        }
      }, 1);

    Common_Methods.set_locale_changed(false); // Reset the Language change flag to prevent repeating Fragment recreation.
    super.onConfigurationChanged(newConfig);
}

如果我在那时重新打开首选项片段 - 它将采用新选择的语言。

我尝试将上述方法复制到我的Preference_Fragment,但我收到了错误。所以问题是:如何在选择后立即使用新语言重新创建/重新加载Preference_Fragment,而不必先退出片段?

2 个答案:

答案 0 :(得分:1)

最好让活动知道(通过getActivity()和cast)您希望更新片段,并向活动添加逻辑以删除片段并添加新实例。

在您的设置活动中:

public void restartFragment() {
    SettingsFragment fragment = new SettingsFragment();
    getFragmentManager().beginTransaction().replace(android.R.id.content, fragment).commit();
}

在您的设置片段中:

((SettingsActivity) getActivity()).restartFragment();

答案 1 :(得分:0)

Floren的回答对我没有用(可能是由于使用了Android支持库),但它引导我根据Florens的相同基本想法提出以下解决方案。不同之处在于删除并添加片段而不是替换:

在您的活动中:

public void restartFragment() {
    FragmentManager fm = getSupportFragmentManager();

    if (fragment != null) {
        FragmentTransaction ft = fm.beginTransaction();
        ft.remove(fragment);
        ft.commit();
    }

    fragment = <new instance>;

    FragmentTransaction ft = fm.beginTransaction();
    ft.add(R.id.fragmentActivity, main, "Main");
    ft.commit();
}

在你的片段中:

((<your activity>)getActivity()).restartFragment();