Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
首选屏幕android:摘要更新!_Android - Fatal编程技术网

首选屏幕android:摘要更新!

首选屏幕android:摘要更新!,android,Android,在我的android应用程序中,我有一个首选项屏幕父项,它有3个复选框首选项 当我单击父项首选项屏幕并显示3个复选框时,我选择其中一个,并在与复选框关联的Preference.OnPreferenceChangeListener中设置父项首选项屏幕摘要: Parent.setSummary("string depending on the selection") 问题是,当我返回到父级时,它的摘要不会更新,即使在内部,该值已相应地更改为设置的值 有人知道这种行为吗 我发现它似乎是通过使用get

在我的android应用程序中,我有一个
首选项屏幕
父项,它有3个
复选框首选项

当我单击父项首选项屏幕并显示3个复选框时,我选择其中一个,并在与复选框关联的Preference.OnPreferenceChangeListener中设置父项首选项屏幕摘要:

Parent.setSummary("string depending on the selection")
问题是,当我返回到父级时,它的摘要不会更新,即使在内部,该值已相应地更改为设置的值


有人知道这种行为吗

我发现它似乎是通过使用
getListView().invalidate()

跟踪
setSummary()
来工作的。您可以使用父
首选项屏幕上的
BaseAdapter.notifyDataSetChanged()
来更新
UI
。参见此处示例代码:

使用

Parent.setSummary("string depending on the selection");
((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged();

它就像一个符咒,无论你在什么地方更改摘要都可以使用。

新的坚持碎片而不是活动似乎使这一点更加困难。
invalidate
路由似乎不起作用,也无法使用底层视图。多亏了halxinate的回答,我现在已经设法解决了这个问题。对于像我这样对所有这些都不熟悉的人,这里有一些更多的细节:

创建设置片段时,请在主活动中保存引用,例如:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    switch (item.getItemId()) {
    case R.id.action_preferences:
        if (getFragmentManager().getBackStackEntryCount() < 1) {
            FragmentTransaction trans = getFragmentManager()
                    .beginTransaction();
            // Save a reference to the settings fragment
            settingsFrag = new SettingsFragment();
            trans.replace(R.id.container, settingsFrag);
            trans.addToBackStack(null);
            trans.commit();
        }
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

请注意,您可以保存对
BaseAdapter
的引用,而不是对设置片段的引用,但是当您考虑将其推广到动态创建片段内容的多片段情况或代码时,这种方法似乎更安全。

这是正确的方法

Preference pref = findPreference(getString(R.string.key_of_pref));
PreferenceScreen parent = (PreferenceScreen) sf.findPreference(getString(R.string.key_of_preference_screen));
pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
   @Override
   public boolean onPreferenceChange(Preference preference, Object newValue) {
       boolean newValueBool = (Boolean) newValue;
       parent.setSummary(newValueBool ? "Summary is true" : "Summary is false");                                                  
       ((BaseAdapter) getPreferenceScreen().getRootAdapter()).notifyDataSetChanged();
       // true to update the state of the Preference with the new value
       // in case you want to disallow the change return false
       return true;
  }
});

如果您使用的是支持首选项,而不是:

findPreference("your_preference").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {

            public boolean onPreferenceChange(Preference preference, Object o) {
                getListView().getAdapter().notifyDataSetChanged();
                return true;
            }
        });

需要注意的一点是,如果感兴趣的首选项本身是
CheckBoxPreference
(或其他
TwoStatePreference
,例如
SwitchPreference
),那么如果分配了
android:summaryOn
android:summaryOff
,则
setSummary
不起作用。在这种情况下,应使用
setSummaryOn
setSummaryOff
,这在imho中并不明显。如果屏幕嵌套在其他屏幕中,则应在直接父屏幕上执行。
findPreference("your_preference").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {

            public boolean onPreferenceChange(Preference preference, Object o) {
                getListView().getAdapter().notifyDataSetChanged();
                return true;
            }
        });