Cómo llenar ListPreference dinámicamente cuando onPreferenceClick se dispara?

Tengo una actividad de preferencia que tiene un language como ListPreference que muestra la lista de idiomas disponibles. Puedo llenar la lista cuando onCreate se llama, pero quiero llenar la lista cuando el usuario hace clic en ella.

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; } } 

Y este es el settings.xml (preferencia):

 <?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> 

Busqué pero no encontré ningún resultado! Se produce una excepción cada vez que haga clic en esa lista.

Usted está recibiendo la excepción porque su objeto ListPreference no está completamente inicializado. Necesita establecer entries y atributos entryValues en su XML o hacerlo de forma programática en onCreate() .

Si lo que desea es poder cambiar los elementos de la lista de forma dinámica después de inicializar el objeto ListPreference inicial, tendrá que adjuntar OnPreferenceClickListener directamente al objeto ListPreference. Utilice la clave que ha especificado en el XML para obtener un identificador a la preferencia.

Dado que el código para rellenar las entries y los arrays entryValues tendrán que ejecutarse tanto en onCreate() como en onPreferenceClick , tiene sentido extraerlo a un método separado – setListPreferenceData() para evitar la duplicación.

 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); } } 

Utilizar PreferenceFragment y JAVA establecer clave en lugar de PreferenceActivity y XML, como se muestra en https://stackoverflow.com/a/13828912/1815624 , que esta respuesta se basa en:

Si lo que desea es poder cambiar los elementos de la lista de forma dinámica después de inicializar el objeto ListPreference inicial, tendrá que adjuntar OnPreferenceClickListener directamente al objeto ListPreference. Utilice la clave que ha especificado en la fuente JAVA (como CUSTOM_LIST ) para obtener un identificador de la preferencia.

Dado que el código para rellenar las entries y los arrays entryValues tendrán que ejecutarse tanto en onCreate() como en onPreferenceClick , tiene sentido extraerlo a un método separado – setListPreferenceData() para evitar la duplicación.

 /** * 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); } } 

Diseño XML:

 <?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> 
  • PreferenceFragment se muestra de forma transparente
  • Interruptor principal de encendido / apagado en ActionBar
  • ¿Qué archivo de configuración prefiere leer / escribir en PreferenceFragment?
  • ¿Cómo obtener las preferencias del sistema Android?
  • Cuándo usar CheckBox y cuando cambie
  • ¿Dónde debe ir un archivo .xml de Preferencias?
  • Establecer la fuente personalizada para el texto en PreferenceScreen
  • ¿Cuál es la diferencia entre TypedArray.getInteger () y TypedArray.getInt ()?
  • Cómo leer / escribir las preferencias de un DialogFragment?
  • ¿Cuál es la diferencia de AppCompatPreferenceActivity y SettingActivity?
  • ¿Cómo usar el Porcentaje para el diseño de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.