2012-06-05 73 views
1

我定義我的喜好,如下面的XML文件:爲什麼Android會忽略返回true的OnPreferenceClickListener()?

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
<PreferenceScreen 
    android:title="@string/pref_screen" 
    android:key="pref_screen_key"> 

    <CheckBoxPreference 
     android:defaultValue="true" 
     android:key="prefs1_key" 
     android:title="@string/prefs1_str" 
     android:summary="@string/prefs1_summary" /> 
     .... 

裏面PreferenceActivity我重寫onPreferenceClick()爲 「pref_screen_key」:

 ... 
    findPreference("pref_screen_key").setOnPreferenceClickListener(
    new OnPreferenceClickListener() { 

    @Override 
    public boolean onPreferenceClick(Preference preference) { 
     if (flag) { 
       // do some stuff 
       return true; // According to Android doc it means, that click was handled 
      } else 
       return false; 
    } 

所以我希望用CheckBoxPreference Android將不開放的觀點如果我的標誌是真的,但只是執行我的東西(我在onPreferenceClick()中返回true以表示單擊已被處理,並且不需要執行默認的onPreferenceClick()行爲)。 不幸的是,Android總是以默認行爲處理onPreferenceClick(),並同時使我的東西。

難道是Android的一個bug? 有沒有辦法阻止Android顯示CheckBoxPreference用戶點擊PreferenceScreen後?

回答

1

您可能遇到問題,flag必須聲明爲最終訪問OnPreferenceClickListener內部。嘗試將它封裝在一個類中並聲明類是最終的。

爲了更直接地回答你的問題,請記住,當你從onPreferenceClick()返回true時,你告訴系統「別擔心,我處理了它。」所以,當你沒有真正做任何事情的時候,你只是簡單地迴歸真理,系統不會忽略你,本身,當你點擊Preference時,你只是告訴它什麼也不做。

你的代碼類似於線的this example 108-115。仔細看看,這可能會有所幫助。

0

bug是https://github.com/android/platform_frameworks_base/blob/android-5.1.1_r13/core/java/android/preference/Preference.java#L985

在Preference.performClick,則檢查的IsEnabled()爲true,則調用的onClick(),那麼你的聽衆,並返回如果返回false - 如果沒有,繼續處理和傳播點擊右邊的樹/屏幕/開始指定的活動。

的缺陷是,它的onPreferenceClick前調用的onClick,因此,例如複選框總是切換,不管你是什麼onPreferenceClick回報。

解決方法:不幸的是,你需要繼承所有的喜好,做你自己的監聽器調度和來電super.onClick()如果允許的話。

0

我相信你想使用setOnPreferenceChangeListener代替setOnPreferenceClickListener的。按照android docs

這是在首選項的狀態即將更新並且狀態持續之前調用的。

返回:

真正的更新與新價值偏好的狀態。

實施例:

Preference pref = findPreference("pref_key"); 
pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 
    @Override 
    public boolean onPreferenceChange(Preference preference, Object newValue) { 
    if (flag) { 
     // do some stuff 
     return false; // Pref change will be not be persisted. 
    } else { 
     return true; 
    } 
    } 
}); 
相關問題