2013-03-20 76 views
13

我正在構建一個首選項活動,其中列表中的大多數首選項都將執行代碼,而不是直接修改SharedPreference。我的preferences.xml文件看起來像這樣。偏好活動偏好Click Click 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> 

我的目標是有點擊這些偏好的一個時執行的代碼塊。與Google Play設置首選項菜單中的「清除搜索記錄」類似。 (http://i.imgur.com/qnHbJX9.png

有誰知道如何使這成爲可能?

我必須補充說我已經嘗試使用findPreference(「KeyNameHere」),但它總是返回null。

謝謝!


編輯:

我在此代碼添加和實施OnPreferenceClickListener:

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

但這種方法不會被調用。有沒有另一種方法來做到這一點?


編輯2:

我發現,如果我拿出PreferenceCategory標籤,所以我離開了這一點:

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

並稱之爲:

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

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

然後我實際上得到了點擊事件的響應。唯一的缺點是我必須刪除偏好分組。任何人都知道這是爲什麼和解決它的方法?

回答

7

我想到了我自己的(我相信這是真的搞砸)解決方案;但它的工作原理。

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

      }); 
     } 
    } 

所以我打聽有沒有是像一個等級制度:PreferenceScreen有孩子PreferenceCategory有孩子偏好,因爲你可以在XML文件中看到。我的問題是我無法直接從PreferenceScreen設置偏好設置onClickListeners。所以我做了兩個for循環,每個Preference都會設置一個OnPreferenceClickListener,併爲它們中的每一個設置一個OnPreferenceClickListener。凌亂,但終於奏效。

+1

+1您的解決方案暗示了我在我的應用程序中選擇的內容。我創建一個String類型的數組,然後爲每個數組獲取'Preference'並設置'onPreferenceClick'。這是幾行代碼。謝謝。 – Sufian 2014-08-12 06:15:42

+0

雖然這可能看起來不錯,但是使用的方法已被棄用。如果您有更新的答案,請編輯您的帖子。注意getPreferenceScreen()已被棄用。謝謝 – ralphgabb 2015-05-04 00:43:12

11

實施OnPreferenceClickListener並在onPreferenceClick

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

謝謝你的快速反應!請參閱原文中的第一次編輯。 – BarryBostwick 2013-03-21 00:34:47

+1

那麼您是否實現了OnPreferenceClickListener? – 2013-03-21 00:41:45

+0

我試圖實現,但我遇到的問題是我永遠不會從代碼中加載任何偏好對象。正如我在我原來的帖子中寫道,findPreference(「KeyNameHere」),所以我永遠無法找到一個方法來實現OnPreferenceClickListener總是返回null。 – BarryBostwick 2013-03-21 01:06:55

8

您還可以找到首選項並設置點擊偵聽器。

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

也許這對OP沒有用,但可能對其他人有用。 我想寫一個摘要; 1)你可以用

Preference examplePreference = findPreference(KEY_EXAMPLE_PREFERENCE); 

某處你的代碼中找到自己的喜好,然後你可以添加一個點擊監聽,並覆蓋其上單擊的方式與

examplePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 
    @Override 
    public boolean onPreferenceClick(Preference preference) { 
     // handle click here 
    } 
}); 
:在一般情況下,你可以主要有三種方式跟隨

這對每一個首選項,你要聽 2,其點擊)可實現Preference.OnPreferenceClickListener接口設置片段/活動,覆蓋onPreferenceClick只有一次,使用的if-else如果交換機結構或做-else if -...構造併合並所有單個處理;它應該是這樣的:

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

然後,你還是要找到每個偏好,但你可以在他們每個人只需撥打

setOnPreferenceClickListener(this); 

(我認爲業務方案的實施沒有工作(他因爲這最後一部分的方法,不叫)) 我們傳遞「這個」作爲參數,因爲我們實施了點擊監聽器接口

3)(我認爲這是最簡單的),你可以重寫

onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) 
在沒有實施任何其它接口您的喜好片段/活性

在那裏你可以複製的if-else如果-...的開關構建選項2);主要優點在於您不需要查找每個首選項並調用setOnPreferenceClickListener。

希望這將是有用的人!

+0

幫助了我,謝謝。 – 2017-09-11 23:21:36

5

只是覆蓋:

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

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

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

謝謝,它幫助我 – 2015-02-08 21:04:50

+0

謝謝,真正的答案在這裏! – DiegoAlt 2017-06-14 03:09:22

0

您的喜好對象不會得到空當,你會發現以下 (從項目copypasting):

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

.....

}