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

相关推荐
csdn122598733640 分钟前
Android12 新启动页到底该怎么做
android·启动页
aaajj2 小时前
【Android】关于MY_PACKAGE_REPLACED广播
android
4Forsee3 小时前
【Android】动态操作 Window 的背后机制
android·java·前端
华锋20223 小时前
2025.12首次体验 arkui-x 跨平台开发库
android
allk554 小时前
Android 性能优化之启动加速:从底层原理到架构治理
android
QuantumLeap丶4 小时前
《Flutter全栈开发实战指南:从零到高级》- 24 -集成推送通知
android·flutter·ios
用户41659673693555 小时前
WebView 滚动失灵?剖析 `scrollBy()` 在现代 Web 布局中的失效陷阱
android
明川5 小时前
Android Gradle学习 - Gradle插件开发与发布指南
android·前端·gradle
二流小码农6 小时前
鸿蒙开发:上架困难?谈谈我的上架之路
android·ios·harmonyos