How to fill ListPreference dynamically when onPreferenceClick is triggered?
android, android-preferences
Solution
You are getting the exception because your ListPreference object is not initialized - you either need to set `entries` and `entryValues` attributes in your XML or do it programatically in `onCreate()` or in `onCreatePreferences()` (e.g. when using `androidx.preference.PreferenceFragmentCompat`).
If if you need to change the items in the list dynamically after the initial ListPreference object has been initialized then a `OnPreferenceClickListener` needs to be set on the ListPreference object. Use the key you have specified in the XML to get a handle to the preference.
Since the code to populate the `entries` and `entryValues` arrays will have to be run both in `onCreate()` and in `onPreferenceClick`, it makes sense to extract it to a separate method - `setListPreferenceData()` in order to avoid duplication.
public class SettingsActivity extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
addPreferencesFromResource(R.xml.settings);
} catch (Exception e) {
}
final ListPreference listPreference = (ListPreference) findPreference("language");
// THIS IS REQUIRED IF YOU DON'T HAVE 'entries' and 'entryValues' in your XML
setListPreferenceData(listPreference);
listPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
setListPreferenceData(listPreference);
return false;
}
});
}
protected static void setListPreferenceData(ListPreference lp) {
CharSequence[] entries = { "English", "French" };
CharSequence[] entryValues = {"1" , "2"};
lp.setEntries(entries);
lp.setDefaultValue("1");
lp.setEntryValues(entryValues);
}
}
Here is another example from google's DeskClock app:
Problem
I have a preference activity that has a `language` as `ListPreference` which displays the available language list. I can fill the list when onCreate is called, but I want to fill the list when the user clicks on it. `this is the java code` : ``` public class SettingsActivity extends PreferenceActivity implements OnPreferenceClickListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { addPreferencesFromResource(R.xml.settings); } catch (Exception e) { } } @Override public boolean onPreferenceClick(Preference preference) { if((preference instanceof ListPreference) && (preference.getKey().equals("language"))){ ListPreference lp = (ListPreference)preference; CharSequence[] entries = { "English", "French" }; CharSequence[] entryValues = {"1" , "2"}; lp.setEntries(entries); lp.setDefaultValue("1"); lp.setEntryValues(entryValues); return true; } return false; } } ``` and this is the `settings.xml` (preference) : ``` <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="General Settings"> <CheckBoxPreference android:key="enabled" android:title="Application Status" android:summary="Enable or disable the application" /> <ListPreference android:key="language" android:title="Language" android:dialogTitle="Application language" android:summary="Select the Application language" /> </PreferenceCategory> </PreferenceScreen> ``` I searched but found no result! An exception occurs every time I click on that list.