Dynamically Modify Custom PreferenceScreen Data

I am working on a custom PreferenceScreen , I created a custom screen for the settings page using PreferenceActivity .

The settings screen is shown below.

enter image description here

Release: - I need to change the data load icon dynamically. I followed this question to achieve this layout. I already tried all the answers to this question, but one answer did not work.

Is there any other way to find a view that is inside preferences?

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> 
+7
source share
2 answers

You can subclass Preference by 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 changes, you can use it a little easier - from your PreferenceActivity :

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

More simply, you can use the standard Preference , simply compose its summary field as an β€œicon”, then you can set the value using the Summary field:

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

Let me know if you have any questions.

+4
source

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 the 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 settings, you can do everything, and you can override setSummary (int value)

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

All Articles