2013-03-20 10 views
13

Buduję działanie preferencji, w którym większość preferencji na liście będzie wykonywała kod i nie będzie bezpośrednio modyfikować udostępnionej subskrypcji. Mój plik preferences.xml wygląda następująco.Aktywność preferencji dla odbiorcy kliknięcia preferencji Prefiks

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

Moim celem jest, aby blok kodu wykonywany, gdy jeden z tych preferencji są kliknięciu. Podobne do "Wyczyść historię wyszukiwania" w menu preferencji ustawień Google Play. (http://i.imgur.com/qnHbJX9.png)

Czy ktoś wie, jak to zrobić?

Muszę dodać, że próbowałem używać findPreference ("KeyNameHere"), ale zawsze zwraca wartość null.

Dziękujemy!


Edit:

dodałem w tym kodzie i wdrożone OnPreferenceClickListener:

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

Ale ta metoda nigdy nie jest wywoływana. Czy jest inny sposób na zrobienie tego?


Edit 2:

I odkryli, że jeśli ja wyjąć PreferenceCategory tagów więc ja zostaję z tym:

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

i nazywają to:

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

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

następnie otrzymuję odpowiedź od zdarzenia kliknięcia. Jedyną wadą jest to, że muszę usunąć grupowanie preferencji. Ktoś wie, dlaczego tak jest i jak to naprawić?

Odpowiedz

7

wymyśliłem własną rękę (co moim zdaniem jest naprawdę pomieszane) rozwiązanie; ale działa.

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

      }); 
     } 
    } 

Więc czego nauczyłem to jest hierarchiczny system, który działa jak: PreferenceScreen ma dzieci PreferenceCategory ma preferencje dzieci, jak można zobaczyć w pliku XML. Mój problem polegał na tym, że nie mogłem ustawić preferencji "onClickListeners" bezpośrednio z PreferenceScreen. Zrobiłem więc dwie pętle, które przejdą do każdej Preferencji i ustawię OnPreferenceClickListener dla każdego z nich. Brudny, ale działa nareszcie.

+1

+1 Twoje rozwiązanie podpowiedziało mi, co wybrałem w mojej aplikacji. Tworzę tablicę kluczy 'String', a następnie otrzymuję' Preference' dla każdego z nich i ustawię 'onPreferenceClick'. To kod kilku linii. Dzięki. – Sufian

+0

, chociaż może się wydawać, że to prawda, ale metoda, która była użyta, została uznana za przestarzałą. Jeśli masz zaktualizowaną odpowiedź, edytuj swój wpis. Uwaga: getPreferenceScreen() jest przestarzałe. Dzięki – ralphgabb

11

Wdrożenie OnPreferenceClickListener aw onPreferenceClick

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

Dziękuję za szybką odpowiedź! Zapoznaj się z moją pierwszą edycją w oryginalnym wpisie. – BarryBostwick

+1

Czy zaimplementowałeś OnPreferenceClickListener wtedy? –

+0

Próbowałem to zaimplementować, ale napotkany problem polegał na tym, że nie mogłem załadować żadnego z obiektów preferencji z kodu. Jak napisałem w moim oryginalnym wpisie, findPreference ("KeyNameHere") zawsze zwraca wartość null, więc nie mogłem znaleźć sposobu na wdrożenie OnPreferenceClickListener. – BarryBostwick

8

Można również znaleźć preferencje i ustawić odbiornik kliknięć.

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

Może to nie może być użyteczne dla OP, ale może być przydatne dla kogoś innego. Chciałbym napisać coś w rodzaju podsumowania; w ogóle, można śledzić głównie trzy sposoby: 1) znajdują swoje preferencje gdzieś w kodzie z

Preference examplePreference = findPreference(KEY_EXAMPLE_PREFERENCE); 

a następnie można dodać kliknij słuchacza i zastąpić jej na metodzie kliknąć

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

Należy to zrobić dla każdej preferencji, której kliknięć chcesz słuchać 2) Możesz zaimplementować interfejs Preference.OnPreferenceClickListener w swoim fragmencie ustawień/aktywności i zastąpić onPreferenceClick tylko raz, używając konstruktu switch lub if-else if -else if -... konstruuj i scalaj wszystkie pojedyncze operacje; powinno być coś takiego:

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

Następnie, trzeba jeszcze znaleźć każdą preferencję ale można po prostu zadzwonić na każdej z nich

setOnPreferenceClickListener(this); 

(myślę, że realizacja PO nie wyszło (His metoda nie nazywano), ponieważ od tej ostatniej części) mijamy „to” jako parametr ponieważ wdrożyliśmy interfejs click słuchacza

3) (co moim zdaniem jest najprostszym) można zastąpić

onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) 

w twoim preferencji fragment/działanie bez implementowania żadnego innego interfejsu i tam możesz skopiować przełącznik konstrukcji if-else if ... opcji 2); Główną zaletą jest to, że nie powinieneś szukać każdej preferencji i wywoływać ich setOnPreferenceClickListener.

Mam nadzieję, że przyda się to komuś!

+0

Pomógł mi, dziękuję. –

5

Wystarczy nadpisać:

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

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

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

Dzięki, pomogło mi –

+0

Dzięki, prawdziwa odpowiedź tutaj! – DiegoAlt

0

Twój obiekt Preferencje przyzwyczajenie null, jeśli znajdziesz poniższych (copypasting od projektu):

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

.....

} 
Powiązane problemy