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 )

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

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

…..

 } 
  • Cómo establecer el resumen de preferencias edittext y hacer que se pegue
  • ¿Cuál es la diferencia entre las entradas y los valores de entrada en android listPreferences xml?
  • ¿Cómo detectar si se hicieron cambios en las preferencias?
  • Preferencias de Android: ¿Cómo cargar los valores predeterminados cuando el usuario no ha utilizado la pantalla de preferencias?
  • ¿Cómo obtener preferencias de tono en tiempo de ejecución?
  • Las preferencias compartidas sólo se guardan por primera vez
  • ¿Cuál es el nombre de archivo utilizado por defecto las preferencias compartidas?
  • Disposición de la pantalla de preferencias de Android
  • Archivo de preferencias del usuario vs Archivo de preferencias de la aplicación
  • Android: ¿Cómo puedo guardar, borrar y restaurar SharedPreferences para la prueba de unidades?
  • Preferencias con ActionBar Sherlock
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.