在我的應用程序的首選項中,我可以選擇更改應用程序的語言。在首選項中選擇新語言時重新加載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?
我試過,但首片段還沒有被重新加載。我甚至試圖刪除當前的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