2013-04-18 80 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)+" ...."); 
}