最近使用Android原生的Switch控件的时候,发现了一个问题。SDK版本是22,运行在Android5.1.1上,Switch的滑块(thumb)用手拖动到滑轨(track)中间的时候,不放手停顿一会,滑块就会卡在Switch中间不动了,复现的几率还很高。我不知道是Android原生switch控件的问题,还是我其他设置的问题。先说一下我是怎么使用的吧。
switch的xml布局
<Switch
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:switchMinWidth="20dp"
android:textOff="Off"
android:textOn="On"
android:thumb="@drawable/thumb"
android:track="@drawable/track" />
布局文件没什么好说的,就是switch的一般用法。
switch在code中的使用
private void initSwitch(final Switch aSwitch, String key) {
// 初始化Switch状态
boolean flag = getAppParamBoolean(key);
mSwitch.setChecked(flag);
mSwitch.setSwitchTextAppearance(this, flag ? R.style.s_true : R.style.s_false);
mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
// 控制Switch字体颜色
mSwitch.setSwitchTextAppearance(MainActivity.this, b ? R.style.s_true : R.style.s_false);
}
});
}
上面的代码就是switch在代码中的使用,我这里把对switch的操作全部放到了initSwitch
方法里面,传入两个参数:第一个参数传入switch控件,第二个参数是一个key,是用getAppParamBoolean(key)
从数据库里面取到储存的switch的状态,当然这不重要。除此之外没有别的地方对switch控件进行处理的地方,但是运行之后,就会出现文章开头出现的状况。
重点来了,下面是解决方法
针对这种状况,我上网找了找,也没找到很符合的情况以及处理方法。最后我也是调了很久,最后还是选了一个简单的投机取巧的方法。直接上代码:
mSwitch.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == ACTION_UP) {
// 解决Switch滑块拖到中间停住问题
mSwitch.setChecked(mSwitch.isChecked());
}
return false;
}
});
------ 在刚刚的initSwitch
方法里面加上上面的代码。思路是这样的:之前描述了问题的‘症状’,用手拖动滑块到中间的时候停顿几秒,松开手就有几率出现滑块卡在滑轨中间的情况。在松开手的时候会触发onTouch
事件的ACTION_UP
,于是我在switch的触碰监听(OnTouch)的ACTION_UP
情况里面,再次setCheck
了一下我的switch控件,所以当你松开手的时候,switch的滑块就不会停住了。
OK,不管怎么样,经过上面的处理,我也没有再发现什么问题了。所以在博客里面记录一下,希望看到本文的朋友,能去尝试一下。或者知道什么原因的大神,可以不吝评论,为我点解一下,问题出在什么地方。谢谢!
网友评论