PreferenceScreen android:摘要更新!

时间:2010-03-07 12:00:53

标签: android

在我的Android应用程序中,我有一个PreferenceScreen个父母,其中有3个CheckBoxPreferences作为孩子。

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

Parent.setSummary("string depending on the selection")

问题是,当我返回到父级时,它的摘要不会更新,即使内部值已相应地更改为设置的值。

有没有人对这种行为有任何想法?

6 个答案:

答案 0 :(得分:13)

使用

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

就像魅力一样,无论您更改摘要的位置都可以使用。

答案 1 :(得分:1)

我发现通过跟setSummary()

跟进getListView().invalidate()似乎有效

答案 2 :(得分:1)

您可以在父BaseAdapter.notifyDataSetChanged()上使用PreferenceScreen来更新UI。请参阅此处代码:Update existing Preference-item in a PreferenceActivity upon returning from a (sub)PreferenceScreen

答案 3 :(得分:1)

这是正确的方法

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

答案 4 :(得分:1)

如果您要使用支持偏好设置而不是:

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

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

答案 5 :(得分:0)

对片段而不是活动的新坚持似乎使这更难。 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);
    }
}

然后,如果要从PreferenceScreen更新外部OnSharedPreferenceChangeListener的摘要,请使用此类内容。请注意,您需要在外部PreferenceScreen(在本例中为android:key="prefs_root")的首选项片段xml中定义一个键:

public static void setOuterSummaries(SettingsFragment sf) {
    // Set the outer preferences summaries
    if (sf == null)
        return;
    //Code to update the summaries....

    // Force the parent screen summaries to update
    prefScr = (PreferenceScreen) sf.findPreference("prefs_root");
    if (prefScr != null)
            ((BaseAdapter) prefScr.getRootAdapter()).notifyDataSetChanged();

}

OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
    public void onSharedPreferenceChanged(SharedPreferences prefs,
            String key) {
        Log.e("L", "Change");
        setOuterSummaries(settingsFrag);
    }
};

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

相关问题