【Android】使用TextView实现按钮开关代替Switch开关

介绍

Android 本身自己带的有开关控件,但是很多时候我们是不愿意使用这种开关的,感觉使用起来比较麻烦,特别是遇到需要延迟操作的情况。

比如有一个需求是这样的:我们需要打开一个设置,但是这个设置是否打开需要经过网络请求获取打开的结果。这样的话需要时间,但是要是使用Switch的话,就会出现点击开关,打开了,然后网络请求的数据返回的是false,这样又要设置Switch设置成关闭的样式,这样就很影响显示的效果,除非我们进行一些处理,但是这样也是挺麻烦的,所以不太爱用这个控件。

解决方式

使用TextView替换Switch,其实我觉得使用TextView可以代替的控件很多,特别是一些要求不精细的页面,ImageView也可以使用TextView代替,TextView真是多才多艺。

实现方式

1.添加开关图片

ic_kaiguan_on

java 复制代码
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="64dp"
    android:height="32dp"
    android:viewportWidth="2048"
    android:viewportHeight="1024">
    <path
        android:fillColor="#3f94f2"
        android:pathData="M1536.01,0L512.01,0C229.23,0 0,229.23 0,512.01c0,282.75 229.23,511.99 512.01,511.99L1536.01,1024c282.78,0 512.01,-229.23 512.01,-511.99C2048.02,229.23 1818.79,0 1536.01,0zM1536.01,921.61a409.62,409.62 0,1 1,409.6 -409.6A409.6,409.6 0,0 1,1536.01 921.61z" />
</vector>

ic_kaiguan_off

java 复制代码
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="64dp"
    android:height="32dp"
    android:viewportWidth="2048"
    android:viewportHeight="1024">
    <path
        android:fillColor="#CCCCCC"
        android:pathData="M1536.01,0H512.01C229.23,0 0,229.23 0,512.01c0,282.75 229.23,511.99 512.01,511.99H1536.01c282.78,0 512.01,-229.23 512.01,-511.99C2048.02,229.23 1818.79,0 1536.01,0zM514.46,921.61a409.62,409.62 0,1 1,409.6 -409.6A409.6,409.6 0,0 1,514.46 921.61z" />
</vector>

2.添加布局

java 复制代码
        <TextView
            android:id="@+id/tv_switch"
            android:layout_width="@dimen/dp_60"
            android:layout_height="@dimen/dp_30"
            android:layout_gravity="center_vertical"
            android:layout_marginEnd="@dimen/dp_10"
            android:background="@drawable/ic_kaiguan_off"
            android:gravity="center" />

3.代码

java 复制代码
       tv_switch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.setSelected(!v.isSelected());
                tv_switch.setBackgroundResource(v.isSelected() ? R.drawable.ic_kaiguan_on : R.drawable.ic_kaiguan_off);
            }
        });

要是遇到需要延迟判断是否开关的情况,那就这样

java 复制代码
 tv_switch.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 执行延时操作
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                // 延时操作结束后,根据结果进行设置开关的状态
                boolean isSwitchOn = // 获取你需要的状态(例如从某个方法或变量)
                 tv_switch.setBackgroundResource(isSwitchOn ? R.drawable.ic_kaiguan_on : R.drawable.ic_kaiguan_off);
            }
        }, 2000); // 2000毫秒(2秒)的延时
    }
});

其实使用TextView代替Switch原因就是,这个Switch点击之后,不管做什么操作都会改变Switch的开关状态,除非进行一些特殊处理,这样处理延时任务就会很麻烦,只要不硬性要求必须使用Switch的情况,一般都喜欢使用TextView。

相关推荐
峥嵘life2 小时前
Android16 【CTS】CtsWindowManagerDeviceAnimations存在fail项
android·linux·学习
阿拉斯攀登3 小时前
第 7 篇 安卓驱动开发的灵魂:字符设备驱动框架,从原理到最简实战
android·驱动开发·rk3568·嵌入式驱动·安卓驱动
阿拉斯攀登4 小时前
第 1 篇 入坑不亏!瑞芯微 RK 平台 + 安卓驱动开发,小白全维度扫盲
android·驱动开发·rk3568·嵌入式驱动
Android系统攻城狮4 小时前
Android tinyalsa深度解析之pcm_params_get调用流程与实战(一百六十二)
android·pcm·tinyalsa·android hal·audio hal
zh路西法4 小时前
【C语言简明教程提纲】(四):结构体与文件定义和操作
android·c语言·redis
常利兵4 小时前
Jetpack Compose 1.8 新特性来袭,打造丝滑开发体验
android
牢七5 小时前
百家cms 审计 未完成
android·ide·android studio
hjxu20165 小时前
【 MySQL 速记5】插入
android·数据库·mysql
aq55356008 小时前
MySQL-触发器(TRIGGER)
android·数据库·mysql
一起搞IT吧9 小时前
Android功耗系列专题理论之十六:功耗不同阶段&不同模块分析说明
android·c++·智能手机·性能优化