2011-01-11 47 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(); 

把這個放在你的偏好聽者,那麼你很好去。