在首选项中选择新语言时重新加载PreferenceFragment
问题描述:
在我的应用程序的首选项中,我可以选择更改应用程序的语言。在首选项中选择新语言时重新加载PreferenceFragment
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_Fragment,但我收到错误。所以问题是:如何在不选择退出片段的情况下立即使用新语言重新创建/重新加载Preference_Fragment?
答
如果让活动知道(通过getActivity()和cast)您想要更新片段,并向活动添加逻辑以删除片段并添加新实例,那最好。
在你设置的活动:
public void restartFragment() {
SettingsFragment fragment = new SettingsFragment();
getFragmentManager().beginTransaction().replace(android.R.id.content, fragment).commit();
}
而在你的设置片段:
((SettingsActivity) getActivity()).restartFragment();
答
弗洛伦的回答并没有为我(由于采用的是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();
我试过,但首片段还没有被重新加载。我甚至试图删除当前的PreferenceFragment,然后用新的实例替换它:'public void restartFragment(){ \t \t Toast.makeText(this,“Restart called”,Toast.LENGTH_SHORT).show(); \t \t getFragmentManager()。beginTransaction()。remove(pref_frag).commit(); \t \t pref_frag = new Fragment_Preferences(); \t getFragmentManager()。beginTransaction()。replace(android.R.id.content,pref_frag).commit(); ''。顺便说一下,吐司在这里工作,只是试图把它放在那里,以确保重启代码已经到达。 – Igal 2014-09-30 09:19:24
你需要做一个新的实例你的片段 – Florens 2014-09-30 09:34:40
是的,这么想,就这样试过了:'public void restartFragment(){ \t \t Toast.makeText(this,“Restart called”,Toast.LENGTH_SHORT).show (); \t \t Fragment_Preferences new_pref_frag = new Fragment_Preferences(); \t getFragmentManager()。beginTransaction()。replace(android.R.id.content,new_pref_frag).commit(); \t}'但结果是一样的,它仍然不会重新加载。 – Igal 2014-09-30 09:41:30