在我们的项目中,我们使用类似于wifi设置的SwitchPreference。用户可以通过单击切换按钮来切换值,并且可以通过单击标题来查看更多选项。
但这不适用于棒棒糖。我可以看到棒棒糖的某些行为发生了变化。
在奇巧中:
当用户点击切换按钮时,将调用onPreferenceChanged回调,而当用户点击标题时,将调用onPreferenceClicked。
在棒棒糖中:
您单击切换按钮或将始终调用标题onPreferenceClicked,然后再调用onPreferenceChanged。
在棒棒糖中如何获得相同的行为?此行为破坏了我们的功能。
最佳答案
我遇到相同的问题,我发现了这个问题:https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&id=172425
经过一番尝试后,我发现了如何实施适用于我的案例的解决方法:
public class MySwitchPreference extends SwitchPreference {
/**
* Construct a new SwitchPreference with the given style options.
*
* @param context The Context that will style this preference
* @param attrs Style attributes that differ from the default
* @param defStyle Theme attribute defining the default style options
*/
public MySwitchPreference(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
/**
* Construct a new SwitchPreference with the given style options.
*
* @param context The Context that will style this preference
* @param attrs Style attributes that differ from the default
*/
public MySwitchPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* Construct a new SwitchPreference with default style options.
*
* @param context The Context that will style this preference
*/
public MySwitchPreference(Context context) {
super(context, null);
}
@Override
protected void onBindView(View view) {
ViewGroup viewGroup= (ViewGroup)view;
setSwitchClickable(viewGroup);
super.onBindView(view);
}
private void setSwitchClickable(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.setClickable(true);
return;
} else if (childView instanceof ViewGroup){
ViewGroup childGroup = (ViewGroup)childView;
setSwitchClickable(childGroup);
}
}
}
然后,您只需要直接将自己的“ MySwitchPreference”使用到SwitchPreference中即可。