2014-07-09 99 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