Actividad de preferencia en el oyente de clics de preferencia
Estoy construyendo una actividad de preferencias en la que la mayoría de las preferencias de la lista ejecutarán código y no modificarán directamente una SharedPreference. Mi archivo preferences.xml se ve así.
<PreferenceCategory android:title="Connection" > <Preference android:id="@+id/settings_connectToNewComputer" android:key="connectToNewComputer" android:summary="Currently connected to:" android:title="Connect to new computer" /> <Preference android:id="@+id/removeDevice" android:key="removeDevice" android:summary="Remove this device from the computer's whitelist" android:title="Remove this device from computer" /> </PreferenceCategory> <PreferenceCategory android:title="About" > <Preference android:id="@+id/settings_About" android:key="about" android:summary="About me and my thanks to those who made this app great" android:title="About Hue Pro" /> <Preference android:id="@+id/contact" android:key="contact" android:summary="Contact me with comments, bugs, and suggestions for updates" android:title="Contact me" /> </PreferenceCategory>
Mi objetivo es que se ejecute un bloque de código cuando se haga clic en una de estas preferencias. Similar al "Borrar historial de búsqueda" en el menú de preferencias de configuración de Google Play. ( Http://i.imgur.com/qnHbJX9.png )
- Escribir a las preferencias compartidas es demasiado lento?
- No se puede establecer la preferencia con PreferenceActivity
- ¿Cómo puedo agregar por programación EditTextPreferences a mi PreferenceFragment?
- Cómo hacer que un cuadro de diálogo de PreferenciaActividad abra una ventana de diálogo para establecer una preferencia personalizada
- Cómo tocar EditTextPrefences de otra actividad u otro hilo
¿Alguien sabe cómo hacer esto posible?
Tengo que agregar que he intentado usar findPreference ("KeyNameHere") pero siempre devuelve null.
¡Gracias!
Editar:
He añadido en este código e implementado OnPreferenceClickListener:
@Override public boolean onPreferenceClick(Preference preference) { return false; }
Pero este método nunca se llama. Hay otra manera de hacer esto?
Editar 2:
He encontrado que si tomo las etiquetas de la categoría de PreferenceCategory así que me quedo con esto:
<Preference android:id="@+id/settings_connectToNewComputer" android:key="connectToNewComputer" android:summary="Currently connected to:" android:title="Connect to new computer" /> <Preference android:id="@+id/removeDevice" android:key="removeDevice" android:summary="Remove this device from the computer's whitelist" android:title="Remove this device from computer" /> <Preference android:id="@+id/settings_About" android:key="about" android:summary="About me and my thanks to those who made this app great" android:title="About Hue Pro" /> <Preference android:id="@+id/contact" android:key="contact" android:summary="Contact me with comments, bugs, and suggestions for updates" android:title="Contact me" />
Y llame a esto:
getPreferenceScreen().setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { return false; } });
Entonces realmente obtengo una respuesta del evento click. El único inconveniente es que tengo que eliminar el grupo de preferencia. Alguien sabe por qué esto es y alguna manera de solucionarlo?
- Anulación del diseño utilizado para una preferencia en una preferenciaActividad / preferencia Pantalla utilizando temas
- Usar TimePicker o DatePicker en la pantalla Preferencias en Android
- Cómo utilizar PreferenceFragment?
- Android: No se ha encontrado actividad para manejar el error de intención? Cómo va a resolver
- Instanciar una clase interna (Preferencia) en un archivo xml
- Almacenar cookie en las preferencias compartidas
- Lea SharedPreferences cuando no haya definido el nombre del archivo
- Cómo establecer varios valores predeterminados en un MultiSelectListPreference?
Implementar OnPreferenceClickListener
y en el onPreferenceClick
@Override public boolean onPreferenceClick (Preference preference) { String key = preference.getKey(); // do what ever you want with this key }
Vine con mi propia (lo que creo que es realmente desordenado) solución; pero funciona.
for(int x = 0; x < getPreferenceScreen().getPreferenceCount(); x++){ PreferenceCategory lol = (PreferenceCategory) getPreferenceScreen().getPreference(x); for(int y = 0; y < lol.getPreferenceCount(); y++){ Preference pref = lol.getPreference(y); pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener(){ @Override public boolean onPreferenceClick(Preference preference) { return false; } }); } }
Así que lo que he aprendido es que hay un sistema jerárquico que funciona como: PreferenceScreen tiene hijos PreferenceCategory tiene hijos Preferencia, como se puede ver en el archivo XML. Mi problema era que no podía establecer las preferencias 'onClickListeners directamente desde la PreferenceScreen. Así que hice dos para los bucles que se bajan a cada preferencia y establecer un OnPreferenceClickListener para todos y cada uno de ellos. Desordenado, pero funciona finalmente.
También puede encontrar la preferencia y establecer el oyente de clics.
Preference connectToNewComputer= findPreference("connectToNewComputer"); connectToNewComputer.setOnPreferenceClickListener(this);
Tal vez esto no podría ser útil para OP, pero podría ser útil para alguien más. Me gustaría escribir una especie de resumen; En general, puede seguir principalmente tres formas: 1) puede encontrar su preferencia en algún lugar de su código con
Preference examplePreference = findPreference(KEY_EXAMPLE_PREFERENCE);
Y luego puede agregar un oyente de clics y anular su método de clic con
examplePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { // handle click here } });
Esto tiene que hacerse para cada preferencia cuyos clics desea escuchar. 2) Puede implementar la interfaz de Preferencia.NPreferenciaClickListener en su fragmento de configuración / actividad y anular onPreferenceClick sólo una vez, utilizando una construcción switch o if-else if-else if -… construir y fusionar todos los handlings individuales; Debe ser algo como:
@Override public boolean onPreferenceClick(Preference preference) { switch (preference.getKey()) { case KEY_EXAMPLE_PREFERENCE: { // handle click here } break; case ... } }
Entonces, usted todavía tiene que encontrar cada preferencia pero usted puede llamar simplemente en cada uno de ellos
setOnPreferenceClickListener(this);
(Creo que la implementación del OP no funcionó (su método no fue llamado) debido a esta última parte) pasamos "this" como parámetro porque implementamos la interfaz de escucha de clics
3) (que creo que es el más fácil) puede anular
onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)
En su fragmento de preferencia / actividad sin implementar ninguna otra interfaz y allí se puede copiar el conmutador de la if-else if -… constructo de la opción 2); La principal ventaja en que no debería necesitar encontrar cada preferencia y llamar a ellos setOnPreferenceClickListener.
Espero que esto sea útil para alguien!
Sólo anular:
@Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { String key = preference.getKey(); ... return super.onPreferenceTreeClick(preferenceScreen, preference); }
Su objeto Preferencia no obtendrá nulo si encuentra los siguientes (copypasting del proyecto):
public class ImePreferences extends PreferenceActivity {
…..
@Override protected boolean isValidFragment(String fragmentName) { return Settings.class.getName().equals(fragmentName); }
…..
public static class Settings extends InputMethodSettingsFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setInputMethodSettingsCategoryTitle(R.string.language_selection_title); setSubtypeEnablerTitle(R.string.select_language); // Load the preferences from an XML resource addPreferencesFromResource(R.xml.ime_preferences); Preference pLcl = getPreferenceScreen().findPreference(getResources().getString( R.string.dictionary_button)); pLcl.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { // handle click here la("this is the click"); return true; } }); if(pLcl != null) la(6576); } }
…..
}
- Crear aplicación de sistema
- ¿Cómo puedo controlar la velocidad de desplazamiento de recyclerView.smoothScrollToPosition (posición)