2013-03-20 12 views
13

Sto costruendo un'attività preferenziale in cui la maggior parte delle preferenze nell'elenco eseguirà codice e non modificherà direttamente SharedPreference. Il mio file preferences.xml ha questo aspetto.Attività preferenziale su Preferenza Clic listener

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

Il mio obiettivo è quello di avere un blocco di codice eseguito quando una di queste preferenze sono scattati. Simile alla "Cancella cronologia ricerche" nel menu delle preferenze di Google Play. (http://i.imgur.com/qnHbJX9.png)

Qualcuno sa come renderlo possibile?

Devo aggiungere che ho provato a utilizzare findPreference ("KeyNameHere") ma restituisce sempre null.

Grazie!


Edit:

ho aggiunto in questo codice e implementato OnPreferenceClickListener:

@Override 
public boolean onPreferenceClick(Preference preference) { 
    return false; 
} 

Ma questo metodo non viene mai chiamato. c'è un altro modo per fare ciò?


Edit 2:

ho scoperto che se prendo i tag PreferenceCategory così mi sono lasciato con questo:

<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" /> 

e chiamo questo:

getPreferenceScreen().setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 

     @Override 
     public boolean onPreferenceClick(Preference preference) { 
      return false; 
     } 
    }); 

quindi ho effettivamente ricevuto una risposta dall'evento click. L'unico lato negativo è che devo rimuovere il raggruppamento delle preferenze. Qualcuno sa perché questo è e in qualsiasi modo per risolvere il problema?

risposta

7

Sono venuto con la mia (quello che credo è davvero incasinato) soluzione; ma funziona

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

      }); 
     } 
    } 

Allora, cosa che ho imparato è che c'è un sistema gerarchico che funziona come: PREFERENCE ha figli PreferenceCategory ha figli Preferenza, come si può vedere nel file XML. Il mio problema era che non potevo impostare le preferenze 'onClickListeners direttamente da PreferenceScreen. Quindi ho creato due cicli for che raggiungeranno ogni preferenza e imposteremo un OnPreferenceClickListener per ognuno di essi. Disordinato, ma funziona finalmente.

+1

+1 La tua soluzione mi ha suggerito ciò che ho scelto nella mia app. Faccio una matrice 'String' di chiavi e poi prendo' Preference' per ognuna e imposto 'onPreferenceClick'. È un codice di poche righe. Grazie. – Sufian

+0

sebbene questo possa sembrare giusto, ma il metodo utilizzato era deprecato. Se hai una risposta aggiornata, modifica il tuo post. Nota getPreferenceScreen() è obsoleto. Grazie – ralphgabb

11

Implementare OnPreferenceClickListener e nel onPreferenceClick

@Override 
public boolean onPreferenceClick (Preference preference) 
{ 
    String key = preference.getKey(); 
    // do what ever you want with this key 
} 
+0

Grazie per la rapida risposta! Si prega di fare riferimento alla mia prima modifica nel post originale. – BarryBostwick

+1

Hai implementato OnPreferenceClickListener allora? –

+0

Ho provato a implementarlo, ma il problema che ho riscontrato è che non ho mai potuto caricare nessuno degli oggetti Preference dal codice. Come ho scritto nel mio post originale, findPreference ("KeyNameHere") restituisce sempre null, quindi non ho potuto trovare un modo per implementare OnPreferenceClickListener. – BarryBostwick

8

È inoltre possibile trovare le preferenze e impostare l'ascoltatore dei clic.

Preference connectToNewComputer= findPreference("connectToNewComputer"); 
connectToNewComputer.setOnPreferenceClickListener(this); 
7

Forse questo potrebbe non essere utile per OP, ma potrebbe essere utile per qualcun altro. Mi piacerebbe scrivere una sorta di riassunto; in generale, è possibile seguire principalmente in tre modi: 1) potete trovare la vostra preferenza da qualche parte nel codice con

Preference examplePreference = findPreference(KEY_EXAMPLE_PREFERENCE); 

e quindi è possibile aggiungere un clic ascoltatore e eseguire l'override la sua sul metodo click con

examplePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 
    @Override 
    public boolean onPreferenceClick(Preference preference) { 
     // handle click here 
    } 
}); 

Questo deve essere fatto per ogni preferenza di cui si desidera ascoltare i clic 2) È possibile implementare l'interfaccia Preference.OnPreferenceClickListener nel proprio frammento/attività delle impostazioni e sovrascrivere onPreferenceClick una sola volta, utilizzando un costrutto switch o un if-else se -else if -... costruire e unire tutti i singoli handling; dovrebbe essere qualcosa di simile:

@Override 
public boolean onPreferenceClick(Preference preference) { 
    switch (preference.getKey()) { 
     case KEY_EXAMPLE_PREFERENCE: { 
      // handle click here 
     } 
     break; 
     case ... 
    } 
} 

Poi, si devono ancora trovare ogni preferenza, ma si può semplicemente chiamare su ciascuno di loro

setOnPreferenceClickListener(this); 

(credo che l'attuazione del PO non ha funzionato (il suo metodo non è stato chiamato) a causa di questa ultima parte) passiamo "questo" come parametro perché abbiamo implementato l'interfaccia click ascoltatore

3) (che credo sia la più semplice) è possibile ignorare

0.123.

nella tua preferenza frammento/attività senza implementare alcuna altra interfaccia e lì puoi copiare l'interruttore del costrutto if-else if -... dell'opzione 2); il vantaggio principale in quanto non dovrebbe essere necessario trovare ogni preferenza e chiamarli su setOnPreferenceClickListener.

Spero che questo sia utile per qualcuno!

+0

Mi ha aiutato, grazie. –

5

Proprio manuali:

@Override 
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 

    String key = preference.getKey(); 
    ... 

    return super.onPreferenceTreeClick(preferenceScreen, preference); 
} 
+0

Grazie, mi ha aiutato –

+0

Grazie, vera risposta qui! – DiegoAlt

0

vostro alloggio per le preferenze non otterrete nulla se troverete seguenti (copypasting dal progetto):

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 
       l.a("this is the click"); 
       return true; 
      } 
     }); 
     if(pLcl != null) 
      l.a(6576); 
    } 
} 

.....

} 
Problemi correlati