【问题标题】:Reloading PreferenceFragment when new language selected in preferences在首选项中选择新语言时重新加载 PreferenceFragment
【发布时间】:2014-09-30 08:38:34
【问题描述】:

在我的应用偏好中,我可以选择更改应用的语言。

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,而不必先退出片段?

【问题讨论】:

    标签: android sharedpreferences android-preferences


    【解决方案1】:

    最好让活动知道(通过 getActivity() 和强制转换)您希望更新片段,并向活动添加逻辑以删除片段并添加新实例。

    在您的设置活动中:

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

    在您的设置片段中:

    ((SettingsActivity) getActivity()).restartFragment();
    

    【讨论】:

    • 我试过了,但是 Preferences 片段仍然没有被重新加载。我什至尝试删除当前的 PreferenceFragment,然后用新实例替换它:public void restartFragment() { Toast.makeText(this, "Restart called", Toast.LENGTH_SHORT).show(); getFragmentManager().beginTransaction().remove(pref_frag).commit(); pref_frag = new Fragment_Preferences(); getFragmentManager().beginTransaction().replace(android.R.id.content, pref_frag).commit(); }。顺便说一句,Toast 确实在这里工作,只是试图把它放在那里以确保到达重新启动代码。
    • 你需要为你的片段创建一个新实例
    • 是啊,这么想,就这样试了一下:public void restartFragment() { Toast.makeText(this, "Restart called", Toast.LENGTH_SHORT).show(); Fragment_Preferences new_pref_frag = new Fragment_Preferences(); getFragmentManager().beginTransaction().replace(android.R.id.content, new_pref_frag).commit(); },结果还是一样,还是没有重载。
    【解决方案2】:

    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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 2020-10-10
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多