Dynamically change data of Custom PreferenceScreen
I am working on custom PreferenceScreen
, I have created a custom screen for the settings page using PreferenceActivity
.
Below is my preference screen.
Issue:- I need to change badge of Download data dynamically. I followed this question for achieve this layout. I already tried all answer of that question but not working single answer.
Is there any other way to find View which is inside preference?
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>
You can subclass Preference
, overriding onBindDialogView()
- just remember to change the XML from <Preference...>
to include your package and class <com.example.app.BadgedPreference...>
:
@Override
protected void onBindDialogView(View v) {
super.onBindDialogView(v);
Log.v( "onBindDialogView()", v.getClass().getSimpleName() );
}
If your BadgedPreference
has a method for handling your change, you can use it a bit more easily - from within your PreferenceActivity
:
PreferenceScreen myPrefScreen = (PreferenceScreen)getPreferenceScreen();
BadgedPreference bp = (BadgedPreference)myPrefScreen.findPreference("download_data");
// Custom method
bp.setBadgeValue(12);
Even more simply, you can use a standard Preference
, just style its summary field as a 'badge', then you can set the value using the included Summary field:
Preference pref = (Preference)myPrefScreen.findPreference("download_data");
pref.setSummary("12");
Let me know if you have any questions.
You can implement OnSharedPreferenceChangeListener
Something like this:
@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));
}
If you use standard Preference you can try something like this:
/**
* 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()));
}
}
}
}
If you use custom preference, you can do everything, and you can override setSummary(int value)
@Override
public void setSummary(int value) {
setSummary(String.valueOf(value)+" ...." );
}
链接地址: http://www.djcxy.com/p/71014.html