2011-01-11 25 views
7

我有的PreferenceScreen个2级树PreferenceActivity,类似:PreferenceActivity更新概要

<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所述,但似乎永远不会被调用。

任何人都对我在这里失踪的东西有什么提示,或者我失踪的任何更简单的方法?

回答

11

我有同样的问题,似乎调用Activity.onContentChanged()后总结改变纠正我的问题。

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

感谢您的建议。我不久前就停止了这方面的工作,但当我有机会时,我会试试看。 – 2011-04-06 01:34:10

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

} 

希望它能帮助。

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

这个小动作效果很好,我发现了许多不同的可能的解决方案,但只有这一个为我工作。

0

经过一个真正的反复试验和错误,我终于在another SO answer找到答案。这里是神奇的线条:

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

把这个放在你的偏好听者,那么你很好去。