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
:
- TimePicker en PreferenceScreen
- Android: onSharedPreferenceChanged no cambia un resumen de PreferenceScreen
- El tamaño de fuente de título de preferencia personalizada es mayor que la preferencia estándar en android 5
- Advertencia de método obsoleto de Android con respecto a PreferenceActivity
- El teclado virtual se superpone a EditTextPreferenceDialogFragmentCompat cuando AppTheme es translúcido
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.
- Predeterminado bindPreferenceSummaryToValue se bloquea para tipos que no son de cadena
- ¿Cómo obtengo la categoría de una preferencia de Android?
- Cómo cargar la misma preferencia de pantalla en el detalle PreferenceFragment
- Inicializar las preferencias de XML en la actividad principal
- Android MultiSelectListPreference, java.lang.String no se puede convertir en java.util.Set
- ¿Cómo agregar un "oyente de clic largo" a una preferencia?
- ¿Hay alguna manera de hacer que SharedPreferences sea global en toda mi aplicación para Android?
- Android: Cómo obtener el tiempo de un TimePicker cuando se escribe en
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>
- PhoneGap / Android – Bloqueo de la orientación al retrato
- Dibujar el arco de borde redondeado en android con efecto grabado en relieve