在应用程序的首选项中,我可以选择更改应用程序的语言。
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();