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.
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()
.
If if you need to change the items in the list dynamically after the initial ListPreference object has been initialized then you will need to attach the OnPreferenceClickListener
directly to 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:
Using PreferenceFragment & JAVA set key rather than PreferenceActivity & XML as shown in https://stackoverflow.com/a/13828912/1815624, which this answer is based on:
If what you want is to be able to change the items in the list dynamically after the initial ListPreference object has been initialized then you will need to attach the OnPreferenceClickListener
directly to the ListPreference object. Use the key you have specified in the JAVA source (as CUSTOM_LIST
) to get a handle to the preference.
Since the code to populate the entries
and entryValues
arrays will have to run both in onCreate()
and in onPreferenceClick
, it makes sense to extract it to a separate method - setListPreferenceData()
in order to avoid duplication.
/** * This fragment shows data and sync preferences only. It is used when the * activity is showing a two-pane settings UI. */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static class myCustomPreferenceFragment extends PreferenceFragment { final private String CUSTOM_LIST= "custom_list"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_custom_frag); PreferenceCategory targetCategory = (PreferenceCategory) findPreference("CUSTOM_FRAG"); final ListPreference lp = setListPreferenceData((ListPreference) findPreference(CUSTOM_LIST), getActivity()); lp.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { setListPreferenceData(lp, getActivity()); return false; } }); setHasOptionsMenu(true); targetCategory.addPreference(lp); bindPreferenceSummaryToValue(targetCategory); bindPreferenceSummaryToValue(lp); } protected ListPreference setListPreferenceData(ListPreference lp, Activity mActivity) { CharSequence[] entries = { "One", "Two", "Three" }; CharSequence[] entryValues = { "1", "2", "3" }; if(lp == null) lp = new ListPreference(mActivity); lp.setEntries(entries); lp.setDefaultValue("1"); lp.setEntryValues(entryValues); lp.setTitle("Number Of blahs"); lp.setSummary(lp.getEntry()); lp.setDialogTitle("Number of Blah objects"); lp.setKey(CUSTOM_LIST); return lp; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { startActivity(new Intent(getActivity(), SettingsActivity.class)); return true; } return super.onOptionsItemSelected(item); } }
XML layout:
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:key="CUSTOM_FRAG" android:title="Some Options"> </PreferenceCategory> </PreferenceScreen>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With