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



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

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);
}

}

所以当我改变语言时,偏好片段不会立即改变它的语言。我必须退出偏好,然后在我的片段或活动中(取决于我调用偏好片段的位置),我有这样的代码,它用新的语言设置重新启动当前片段或活动:

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片段,它将使用新选择的语言。

我试图将上面的方法复制到我的Preference_Fragment,但我遇到了错误。因此,问题是:如何在选择Preference_Fragment后立即用新语言重新创建/重新加载它,而不必首先退出该片段?

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

在您的设置活动中:

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

在你的设置片段中:

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

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();

最新更新