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

相关推荐
科技峰行者3 分钟前
安卓16提前发布能否改写移动生态格局
android
蒲公英少年带我飞6 分钟前
Android NDK 编译 protobuf
android
沐怡旸28 分钟前
【底层机制】ART虚拟机深度解析:Android运行时的架构革命
android·面试
小禾青青1 小时前
uniapp安卓打包遇到报错:Uncaught SyntaxError: Invalid regular expression: /[\p{L}\p{N}]/
android·uni-app
studyForMokey1 小时前
【Kotlin内联函数】
android·开发语言·kotlin
2501_915921433 小时前
iOS 抓不到包怎么办?工程化排查与替代抓包方案(抓包/HTTPS/Charles代理/tcpdump)
android·ios·小程序·https·uni-app·iphone·tcpdump
诸神黄昏EX5 小时前
Android Init 系列专题【篇六:reboot & shutdown】
android
sTone873755 小时前
Android核心概念(一)minSdkVersion targetSdkVersion compileSdkVersion
android·前端
wuweikai06175 小时前
在Android设备上打开Perfetto调试日志开关
android·性能优化·perfetto