2014-09-30 68 views
0

在我的應用程序的首選項中,我可以選擇更改應用程序的語言。在首選項中選擇新語言時重新加載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?

回答

1

如果讓活動知道(通過getActivity()和cast)您想要更新片段,並向活動添加邏輯以刪除片段並添加新實例,那最好。

在你設置的活動:

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

而在你的設置片段:

((SettingsActivity) getActivity()).restartFragment(); 
+0

我試過,但首片段還沒有被重新加載。我甚至試圖刪除當前的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

+0

你需要做一個新的實例你的片段 – Florens 2014-09-30 09:34:40

+0

是的,這麼想,就這樣試過了:'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

0

弗洛倫的回答並沒有爲我(由於採用的是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(); 
相關問題