我正在使用自定义PreferenceScreen
,我使用PreferenceActivity
为设置页面创建了自定义屏幕。
以下是我的首选屏幕。
问题: - 我需要动态更改下载数据的徽章。 我按照这个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 :(得分:4)
您可以继承Preference
,覆盖onBindDialogView()
- 只需记住从<Preference...>
更改XML以包含您的包和类<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");
如果您有任何问题,请与我们联系。
答案 1 :(得分: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 value)
@Override
public void setSummary(int value) {
setSummary(String.valueOf(value)+" ...." );
}