在我的应用首选项中,我可以选择更改应用的语言。
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,而不必先退出片段?
答案 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();