2014-07-09 123 views
2

我想在我的設置頁面中使用SwitchPreference,但我無法讓偵聽器工作。我正在使用自定義小部件佈局來設計開關樣式,因爲我無法找到如何使用主題來實現此目的。在我的settings.xml我有以下:SwitchPreference監聽器與自定義佈局

<SwitchPreference 
      android:key="uitestmode" 
      android:summary="Enable to display test data in fragments" 
      android:title="UI Test Mode" 
      android:widgetLayout="@layout/widget_custom_switch_on_off" > 
</SwitchPreference> 

和我SettingsFragment樣子:

SwitchPreference uiTestModePref = (SwitchPreference) findPreference("uitestmode"); 
uiTestModePref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 

    @Override 
    public boolean onPreferenceChange(Preference preference, Object newValue) { 
     Log.d(preference.getKey(), newValue.toString()); 
     return false; 
    } 
}); 

和我爲我的切換自定義佈局:

<?xml version="1.0" encoding="utf-8"?> 
<Switch xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/custom_switch_item" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center_vertical" 
    android:textColor="@android:color/white" 
    android:textIsSelectable="false" 
    android:textSize="18sp" 
    android:textOn="On" 
    android:textOff="Off" 
    android:textStyle="bold" 
    android:thumb="@drawable/carcast_switch_inner_holo_dark" 
    android:track="@drawable/carcast_switch_track_holo_dark" /> 

我的問題是,當我單擊開關時,偵聽器不會被調用。有誰知道爲什麼以及如何解決它?

回答

4

我碰到了同樣的問題,我的解決方案是類似如下:

  1. 在您的自定義開關佈局,添加以下代碼。這「揭示」偏好,並使整個模塊可點擊。這就是爲什麼聽衆根本沒有被觸發。

    機器人:可點擊= 「假」 機器人:可調焦= 「假」

  2. 擴展 「SwitchPreference」,並在 「onBindView」 級,從SharedPreferences得到國家和把手開關狀態改變那裏。

    public class MySwitchPreference extends SwitchPreference { 
    
        public MySwitchPreference(Context context) { 
         super(context, null); 
        } 
    
        public MySwitchPreference(Context context, AttributeSet attrs) { 
         super(context, attrs); 
        } 
        public MySwitchPreference(Context context, AttributeSet attrs, int defStyle) { 
         super(context, attrs, defStyle); 
        } 
    
        protected void onBindView(View view) { 
         // Clean listener before invoke SwitchPreference.onBindView 
         ViewGroup viewGroup= (ViewGroup)view; 
         clearListenerInViewGroup(viewGroup); 
         super.onBindView(view); 
    
         final Switch mySwitch = (Switch) view.findViewById(R.id.custom_switch_item); 
         Boolean initVal = this.getPersistedBoolean(false); 
         if (initVal) { 
          mySwitch.setChecked(true); 
         } 
         this.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 
          @Override 
          public boolean onPreferenceChange(Preference preference, Object newValue) { 
           //Do your things here, toggling the switch and so on 
           return true; 
          } 
         }); 
        } 
    
        private void clearListenerInViewGroup(ViewGroup viewGroup) { 
         if (null == viewGroup) { 
          return; 
         } 
    
         int count = viewGroup.getChildCount(); 
         for(int n = 0; n < count; ++n) { 
          View childView = viewGroup.getChildAt(n); 
          if(childView instanceof Switch) { 
           final Switch switchView = (Switch) childView; 
           switchView.setOnCheckedChangeListener(null); 
           return; 
          } else if (childView instanceof ViewGroup){ 
           ViewGroup childGroup = (ViewGroup)childView; 
           clearListenerInViewGroup(childGroup); 
          } 
         } 
        } 
    } 
    

希望這可以幫助你。直到我以這種方式想出來之前,我無法找到解決方案。

+0

嘿RickCase, 我已經使用了這個,你的解決方案就像一個魅力。但我想要一些額外的功能。不知道我是否需要爲它創造一個新的話題,但也許尼爾森b。奧斯汀也想要這個。 我想要的是我的喜好改變,當它被點擊(你的改變做了什麼),但也是可滑動的,使這個改變我的偏好。使其滑動可以通過更改android:clickable爲true來完成。但他解除了以前的解決方案。 你知道一個辦法嗎? 親切的問候, Jeroen – Jeroen

+1

@Jeroen我沒有機會自己嘗試,但我想你可能想嘗試以下操作:1.將android:clickable設置爲true。將[OnCheckedChangeListener](http://developer.android.com/reference/android/widget/CompoundButton.OnCheckedChangeListener.html)設置爲Switch,然後手動更新首選項。這[鏈接](http://stackoverflow.com/questions/552070/android-how-do-i-set-a-preference-in-code)可能會有所幫助。 – RickCase

+0

謝謝,這是解決方案 – Jeroen