PreferenceFragment中的首选项未获得更新

时间:2014-02-18 15:46:10

标签: android preferencefragment

我有一个主要活动加载PreferenceFragment(它是actionBar的一部分)。

在PreferenceFragment中,我从XML文件中加载我的首选项:

   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);

    }

问题是如果我更改Tab(记住它是由ActionBar管理),更改其他片段中的一个首选项并返回到我的preferenceFragment它没有得到更新。特别是问题是SwitchPreference(true / false),可以从不同的片段甚至通过远程调用进行更改(然后在共享首选项中更改首选项。是的,我确实提交了更改)。

我搜索了不同的解决方案,但说实话,我找不到合适的解决方案。 我自己的想法如下:

如果我能得到交换机的Switch Element,我的问题就解决了,所以我可以在onStart()或onResume()方法中将开关设置为true。但获取Switch对象是否有变化? 如果我要加载通常的布局,我可以像这样访问开关:

    View v = inflater.inflate(R.layout.start_fragment, container, false);
    Switch status = (Switch) v.findViewById(R.id.switch1);

之后我可以像这样设置开关的位置:

status.setChecked(true);

另一个解决方案是破坏实际视图并再次调用addPreferencesFromResource(),但说实话我不知道如何做到这一点....

第三种解决方案可能是在我的PreferenceFragment中使用OnCheckedChangeListener,但问题仍然是如何更改/更新交换机。

我确信Preference已正确更新,因为我在其中一个服务中运行OnSharedPreferenceChangeListener并调试此问题我使侦听器记录了switchPreference的状态。

你能以某种方式帮助我吗?


不幸的是,我明天早上才能回答我自己的问题,所以我编辑了我的问题:

谢谢大家,我不想重新启动基础活动,只想重启片段。

幸运的是,我在这个主题中发现了一个线索:How do you refresh PreferenceActivity to show changes in the settings?

我真的可以轻松访问SwitchPreference。 我的解决方案是:

private SwitchPreference pref_phone_locked;

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);

        status = (SwitchPreference) findPreference("status");

    }


    public void onStart(){
            super.onStart();


            SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity());
            if(sharedPref.getBoolean("status", false)){
                status.setChecked(true);
            }else{
                status.setChecked(false);
            }
        }

这样我就可以简单地将Preference转换为SwitchPreference并在每次onStart()调用后修改它。我想这是我问题的最佳解决方案。

希望这个答案能在将来节省一些时间=) 再次感谢你们!

1 个答案:

答案 0 :(得分:0)

我不确定这是否对您有用(我对Android有一个非常基本的知识)但我在类似的问题中找到了这个解决方案,它对我很有用

private void simulateRefresh(){
    Intent intent = getIntent();
    overridePendingTransition(0, 0);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    finish();
    overridePendingTransition(0, 0);
    startActivity(intent);
}

基本上,这会在没有动画的情况下破坏并重新创建活动。

找到here