Android原生Switch控件滑块thumb卡住问题的解决方法

1 篇文章 0 订阅
1 篇文章 0 订阅

最近使用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,不管怎么样,经过上面的处理,我也没有再发现什么问题了。所以在博客里面记录一下,希望看到本文的朋友,能去尝试一下。或者知道什么原因的大神,可以不吝评论,为我点解一下,问题出在什么地方。谢谢!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中自定义Switch控件可以通过自定义drawable来实现。以下是一个简单的例子: 1. 创建一个drawable资源文件,例如 switch_bg.xml,用于定义Switch的背景样式: ```xml <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:drawable="@drawable/switch_on_bg" /> <item android:state_checked="false" android:drawable="@drawable/switch_off_bg" /> </selector> ``` 2. 创建两个drawable资源文件,例如 switch_on_bg.xml 和 switch_off_bg.xml,分别用于定义Switch开和关状态下的样式。 switch_on_bg.xml: ```xml <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#00FF00" /> <corners android:radius="20dp" /> </shape> ``` switch_off_bg.xml: ```xml <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#FF0000" /> <corners android:radius="20dp" /> </shape> ``` 3. 在布局文件中使用自定义Switch控件: ```xml <Switch android:id="@+id/customSwitch" android:layout_width="wrap_content" android:layout_height="wrap_content" android:thumb="@drawable/custom_switch_thumb" android:track="@drawable/switch_bg" /> ``` 其中,android:thumb属性定义了Switch的拇指(即开关按钮)的样式。我们可以创建一个自定义drawable来实现: ```xml <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="#FFFFFF" /> <size android:width="20dp" android:height="20dp" /> </shape> ``` 这样就完成了自定义Switch控件的样式。当Switch状态改变时,背景样式也会随之改变。你可以根据自己的需求来修改样式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值