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

相关推荐
练习本23 分钟前
Android系统架构模式分析
android·java·架构·系统架构
每次的天空5 小时前
Kotlin 内联函数深度解析:从源码到实践优化
android·开发语言·kotlin
练习本6 小时前
Android MVC架构的现代化改造:构建清晰单向数据流
android·架构·mvc
早上好啊! 树哥6 小时前
android studio开发:设置屏幕朝向为竖屏,强制应用的包体始终以竖屏(纵向)展示
android·ide·android studio
YY_pdd7 小时前
使用go开发安卓程序
android·golang
Android 小码峰啊8 小时前
Android Compose 框架物理动画之捕捉动画深入剖析(29)
android·spring
bubiyoushang8888 小时前
深入探索Laravel框架中的Blade模板引擎
android·android studio·laravel
cyy2988 小时前
android 记录应用内存
android·linux·运维
CYRUS STUDIO9 小时前
adb 实用命令汇总
android·adb·命令模式·工具
这儿有一堆花9 小时前
安卓应用卡顿、性能低下的背后原因
android·安卓