如何在Android App中以编程方式控制开关(按钮)

问题描述 投票:0回答:1

我正在 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'

android-studio button switch-statement
1个回答
0
投票

尝试“runOnUiThread”:

runOnUiThread(new Runnable() {
                @Override
                public void run() {
                       switch_1_select.toggle()
                }
            });
© www.soinside.com 2019 - 2024. All rights reserved.