【Android】使用TextView实现按钮开关代替Switch开关
介绍
Android 本身自己带的有开关控件,但是很多时候我们是不愿意使用这种开关的,感觉使用起来比较麻烦,特别是遇到需要延迟操作的情况。
比如有一个需求是这样的:我们需要打开一个设置,但是这个设置是否打开需要经过网络请求获取打开的结果。这样的话需要时间,但是要是使用Switch的话,就会出现点击开关,打开了,然后网络请求的数据返回的是false,这样又要设置Switch设置成关闭的样式,这样就很影响显示的效果,除非我们进行一些处理,但是这样也是挺麻烦的,所以不太爱用这个控件。
解决方式
使用TextView替换Switch,其实我觉得使用TextView可以代替的控件很多,特别是一些要求不精细的页面,ImageView也可以使用TextView代替,TextView真是多才多艺。
实现方式
1.添加开关图片
ic_kaiguan_on
<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
<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.添加布局
<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.代码
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);
}
});
要是遇到需要延迟判断是否开关的情况,那就这样
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。