1

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

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

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

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

    }

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

我搜索了不同的解决方案,但老实说,我没有找到一个可行的解决方案。我自己的想法如下:

如果我可以获得开关的 Switch 元素,我的问题将得到解决,因此我可以在 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 的状态。

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


不幸的是,我无法在明天早上之前回答我自己的问题,所以我编辑了我的问题:

谢谢你们,我不想重新启动底层活动,而只想重新启动片段。

幸运的是,我在这个帖子中找到了一条线索:如何刷新 PreferenceActivity 以显示设置的更改?

我真的可以这么简单地访问 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() 调用后对其进行修改。我想这是解决我问题的最佳方法。

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

4

1 回答 1

0

我不确定这是否适合你(我对 Android 有非常基本的了解),但我在类似的问题中找到了这个解决方案,它对我来说效果很好

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

基本上,这会破坏并重新创建活动,中间没有动画。

在这里找到

于 2014-02-18T16:54:29.150 回答