我正在 Android Studio 中开发一个应用程序。
我有一个开关来启用/禁用某些功能。
我使用 xml 文件来定义拇指和轨道的颜色 - 禁用开关时(拇指向左)均为灰色,启用开关时(拇指向右)均为绿色。
这个效果很好。
但是,当从远程蓝牙设备接收到消息时,我还需要更新开关显示。例如,如果开关处于禁用位置(灰色),并且收到启用消息,那么我想更新开关显示以使其启用(高绿色,拇指向右)。
现在,当我尝试更新开关显示时,开关拇指将颜色更改为绿色(=所需的行为),但是
(a) 拇指保持向左,并且 (b) 轨道保持灰色。
我的代码如下。 谁能看到我做错了什么吗?
提前致谢
加勒特
开关定义:
<Switch
android:id="@+id/switch_1_select"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:thumbTint="@drawable/switch_selector"
android:trackTint="@drawable/switch_selector"
android:text=""
/>
当用户选择/按下开关时:
switch_1_select.setOnClickListener {
if (switch_1_select.isChecked)
{
// do something
} else {
// do something else
}
}
XML 文件(据说)控制开关显示:
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorGreen" android:state_checked="true" />
<item android:color="@color/colorGray"/>
</selector>
从远程设备接收到启用消息时调用的代码:
switch_1_select.isChecked = true
在图片中......
这是一张显示开关处于禁用位置的图片(拇指向左,拇指和轨道均为灰色)。
这是一张显示开关处于启用位置的图片(拇指位于右侧,拇指和轨道均为绿色)。这就是用户单击开关时的外观。
最后,这是一张显示当我以编程方式尝试启用它(从其禁用位置)时的开关的图片。请注意,虽然拇指为绿色,但拇指仍位于左侧,并且轨道颜色仍为灰色。
编辑/更新:
阅读完这篇文章后,我将开关更新为 SwitchCompat: 如何从 AppCompat 库更改 SwitchCompat 的颜色
开关定义:
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/switch_1_select"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=""
/>
所以我不再使用 XML 样式文件来尝试控制拇指/轨道颜色。 相反,在我的应用程序主题中,我定义了颜色:
<!-- colorControlActivated is the color applied to framework controls
in their activated (ex. checked, switch on) state. -->
<item name="colorControlActivated">@color/colorGreen</item>
<!-- colorSwitchThumbNormal is color applied to framework switch
thumbs in their normal state. (switch off). -->
<item name="colorSwitchThumbNormal">@color/colorGray</item>
结果:
一些改进
当我以编程方式检查/取消选中开关时,拇指和轨道颜色会发生变化(灰色表示未选中,绿色表示选中)。
但是拇指位置没有改变。
要以编程方式检查/取消选中开关,我尝试过:
switch_1_select.toggle()
和
switch_1_select.isChecked = false
switch_1_select.isChecked = true
看起来代码可能需要手动设置拇指位置
我试过这个:
switch_cooler_status_select.setThumbPosition(0.0F)
switch_cooler_status_select.setThumbPosition(1.0F)
但我收到以下错误:
无法访问“setThumbPosition”:它是包私有的 'SwitchCompat'
尝试“runOnUiThread”:
runOnUiThread(new Runnable() {
@Override
public void run() {
switch_1_select.toggle()
}
});