2014-09-30 74 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();