【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。

相关推荐
Clockwiseee25 分钟前
PHP伪协议总结
android·开发语言·php
mmsx7 小时前
android sqlite 数据库简单封装示例(java)
android·java·数据库
众拾达人10 小时前
Android自动化测试实战 Java篇 主流工具 框架 脚本
android·java·开发语言
吃着火锅x唱着歌11 小时前
PHP7内核剖析 学习笔记 第四章 内存管理(1)
android·笔记·学习
_Shirley12 小时前
鸿蒙设置app更新跳转华为市场
android·华为·kotlin·harmonyos·鸿蒙
hedalei14 小时前
RK3576 Android14编译OTA包提示java.lang.UnsupportedClassVersionError问题
android·android14·rk3576
锋风Fengfeng14 小时前
安卓多渠道apk配置不同签名
android
枫_feng14 小时前
AOSP开发环境配置
android·安卓
叶羽西15 小时前
Android Studio打开一个外部的Android app程序
android·ide·android studio
qq_1715388516 小时前
利用Spring Cloud Gateway Predicate优化微服务路由策略
android·javascript·微服务