2013-04-18 85 views
7

我正在使用自定義PreferenceScreen,我使用PreferenceActivity爲設置頁面創建了自定義屏幕。動態更改Custom PreferenceScreen的數據

以下是我的首選項屏幕。

enter image description here

問題: - 我需要動態改變數據下載的徽章。 爲了實現這種佈局,我遵循此question。 我已經嘗試了所有問題的答案,但沒有解決單個答案。

有沒有其他方法可以查看哪些是內部偏好?

的settings.xml

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 

<Preference android:title="@string/settings_user_profile" android:key="user_profile" android:summary="@string/settings_user_profile_desc" android:layout="@layout/setting_list"></Preference> 
<Preference android:title="@string/settings_download" android:key="download_data" android:summary="@string/settings_download_desc" android:layout="@layout/setting_list"></Preference> 
</PreferenceScreen> 
+0

發表您設置的XML文件的代碼 – Pratik 2013-04-18 06:43:14

+0

檢查更新的問題...我的代碼是相同的問題,看這個問題.... – 2013-04-18 06:47:54

+1

這會否是好供您使用的活動,而不是喜好 – stinepike 2013-04-18 06:51:14

回答

4

你也可以繼承Preference,覆蓋onBindDialogView() - 只記得到XML從<Preference...>改變,包括你的包和<com.example.app.BadgedPreference...>類:

@Override 
protected void onBindDialogView(View v) { 
    super.onBindDialogView(v); 
    Log.v("onBindDialogView()", v.getClass().getSimpleName()); 
} 

如果BadgedPreference有一個方法來處理你的變化,你可以更容易地使用它 - 從你的PreferenceActivity

PreferenceScreen myPrefScreen = (PreferenceScreen)getPreferenceScreen(); 
BadgedPreference bp = (BadgedPreference)myPrefScreen.findPreference("download_data"); 
// Custom method 
bp.setBadgeValue(12); 

更簡單地說,你可以使用標準的Preference,只是風格及其摘要字段作爲「標誌」,那麼您可以使用附帶的摘要字段設置的值:

Preference pref = (Preference)myPrefScreen.findPreference("download_data"); 
pref.setSummary("12"); 

如果您有任何問題,請告訴我。

+0

謝謝,我用Preference類做過 – 2013-04-22 08:53:16

+0

謝謝,很高興你解決了它。 :) – CodeShane 2013-04-23 23:35:11

0

您可以實現OnSharedPreferenceChangeListener 事情是這樣的:

@Override 
    public void onResume() { 
     super.onResume(); 

     // Set up a listener whenever a key changes 
     getPreferenceScreen().getSharedPreferences() 
     .registerOnSharedPreferenceChangeListener(this);   
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 

     // Unregister the listener whenever a key changes 
     getPreferenceScreen().getSharedPreferences() 
     .unregisterOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, 
     String key) { 

     //update summary 
     updatePrefsSummary(sharedPreferences, findPreference(key)); 
    } 

如果使用標準的首選項,你可以嘗試這樣的事:

/** 
* Update summary 
* 
* @param sharedPreferences 
* @param pref 
*/ 
protected void updatePrefsSummary(SharedPreferences sharedPreferences, 
    Preference pref) { 

if (pref == null) 
    return; 

if (pref instanceof ListPreference) { 
    // List Preference 
    ListPreference listPref = (ListPreference) pref; 
    listPref.setSummary(listPref.getEntry()); 

} else if (pref instanceof EditTextPreference) { 
    // EditPreference 
    EditTextPreference editTextPref = (EditTextPreference) pref; 
    editTextPref.setSummary(editTextPref.getText()); 

} else if (pref instanceof MultiSelectListPreference) { 
    // MultiSelectList Preference 
    MultiSelectListPreference mlistPref = (MultiSelectListPreference) pref; 
    String summaryMListPref = ""; 
    String and = ""; 

    // Retrieve values 
    Set<String> values = mlistPref.getValues(); 
    for (String value : values) { 
     // For each value retrieve index 
     int index = mlistPref.findIndexOfValue(value); 
     // Retrieve entry from index 
     CharSequence mEntry = index >= 0 
       && mlistPref.getEntries() != null ? mlistPref 
       .getEntries()[index] : null; 
     if (mEntry != null) { 
      // add summary 
      summaryMListPref = summaryMListPref + and + mEntry; 
      and = ";"; 
     } 
    } 
    // set summary 
    mlistPref.setSummary(summaryMListPref); 

} else if (pref instanceof RingtonePreference) { 
    // RingtonePreference 
    RingtonePreference rtPref = (RingtonePreference) pref; 
    String uri; 
    if (rtPref != null) { 
     uri = sharedPreferences.getString(rtPref.getKey(), null); 
     if (uri != null) { 
      Ringtone ringtone = RingtoneManager.getRingtone(
        getActivity(), Uri.parse(uri)); 
       pref.setSummary(ringtone.getTitle(getActivity())); 
     } 
    } 

} 

}

如果使用自定義的偏好,你可以做所有事情,你可以覆蓋setSummary(int值)

@Override 
public void setSummary(int value) { 
    setSummary(String.valueOf(value)+" ...."); 
}