PreferenceActivity更新摘要

时间:2011-01-11 01:14:15

标签: android

我有一个PreferenceActivity,其中包含PreferenceScreen的2级树,例如:

<PreferenceScreen>
  <PreferenceScreen android:key="A">
     <ListPreference/>
     <EditTextPreference/>
  </PreferenceScreen>
  <PreferenceScreen android:key="B">
     <ListPreference/>
     <EditTextPreference/>
  </PreferenceScreen>
  ...
</PreferenceScreen>

每个较低级别的偏好屏幕,例如A和B,正在收集两个相关的数据。我希望这些父项的摘要是两个子首选项的当前值的组合。

我尝试在叶子首选项上添加onPreferenceChangeListener并从那里更新摘要,但似乎没有。首选项都是在活动中以编程方式创建的,所以我在onCreate中执行类似的操作:

   leafListPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
       @Override
       public boolean onPreferenceChange(Preference preference, Object newValue) {
              // do some work
              prefScreenA.setSummary( /* get new summary based on newValue */);
              return true;
       }
  });

然后我尝试找到一个位置,我可以通知我已经从子页面返回到顶级首选项屏幕,以便我可以在此时更新。但是,我对如何显示下级屏幕感到困惑。看起来它们实际上是对话框,而不是完整的活动,因为onPause / onResume在它们之间移动时不会被调用。在返回顶级页面时,是否有一些我遗漏的方法会被调用?

我还尝试添加一个sharedPreferenceChangeListener,如here所述,但似乎永远不会被调用。

任何人都有任何关于我在这里缺少什么的提示,或者我错过的任何更简单的方法?

4 个答案:

答案 0 :(得分:12)

我遇到了同样的问题,似乎在更改摘要后调用 Activity.onContentChanged()更正了我的问题。

@Override
public void onSharedPreferenceChanged(SharedPreferences sp, String key) {
  // Update summary value
  EditTextPreference pref = (EditTextPreference)findPreference(key);
  pref.setSummary(pref.getText());
  this.onContentChanged();
}

答案 1 :(得分:1)

经过真正无误的反复试验后,我终于在another SO answer中找到了答案。这是神奇的界限:

((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged();

把它放在你的偏好听众中,然后你就可以了。

答案 2 :(得分:0)

使用以下代码并覆盖onContentChanged()

   public class SettingsActivity extends PreferenceActivity
    {
         @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);
            setContentView(R.layout.settings_layout);


            }

@Override
    public void onContentChanged() {
        // put your code here
        super.onContentChanged();
    }

}

希望它有所帮助。

答案 3 :(得分:0)

我也遇到了这个问题,我终于通过使用来自监听器的值找到了解决方案。 在下面的示例中(对于ListPreference),我首先获取ListPreference数组中的值的索引,然后使用此索引检索值的标签:

passwordFrequencyLP.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            int newFrequency = Integer.valueOf(newValue.toString());

            prefs.edit().putInt("settings_key_password_frequency", newFrequency).commit();

            //get the index of the new value selected in the ListPreference array
            int index = passwordFrequencyLP.findIndexOfValue(String.valueOf(newValue));
            //get the label of the new value selected
            String label = (String) passwordFrequencyLP.getEntries()[index];

            passwordFrequencyLP.setSummary(label);

            makeToast(getResources().getString(R.string.password_frequency_saved));
            return true;
        }
    });

这个小技巧很有效,我找到了很多不同的解决方案来解决这个问题,但只有这个解决了这个问题。