拨动一个按钮,取消另一个按钮。

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

我正在学习Kotlin,我想做两个可以切换的按钮,其特性如下。

  1. 按钮1开始是toggled(true),按钮2开始是untoggled(false)。
  2. 如果我点击未切换的按钮,他就变成了toggled,而另一个按钮则是未切换的。
  3. 如果我点击toggled的按钮,他变成untoggled,而另一个是toggled。
  4. 如果一个按钮为真,另一个按钮为假。
  5. 拨动的按钮总是黄色的,而另一个未拨动的按钮是白色的。

拨动的按钮是黄色的,而未拨动的按钮是白色的。按钮 编码。

<ToggleButton
    android:id="@+id/button1"
    android:background="@color/yellow"
    android:text="ToggleButton"
    android:textOff="Ton"
    android:textOn="Ton"/>

<ToggleButton
    android:id="@+id/button2"
    android:background="@color/white"
    android:text="ToggleButton"
    android:textOff="Kg"
    android:textOn="Kg"/>

The 活动 编码。

private val btn1 by lazy { findViewById<View>(R.id.button1) as ToggleButton }
private val btn2 by lazy { findViewById<View>(R.id.button2) as ToggleButton }

btn1.setOnClickListener{
    btn1.setOnCheckedChangeListener { _, isChecked ->
        if (isChecked) { //if btn1 is true he is yellow and btn2 is false and he is white
            btn2.isChecked = false
            btn1.setBackgroundColor(Color.YELLOW)
            btnLoadModeFrac.setBackgroundColor(Color.WHITE)
        } else { //if btn1 is false he is white and btn2 is true and he is yellow
            btn2.isChecked = true
            btn1.setBackgroundColor(Color.WHITE)
            btn2.setBackgroundColor(Color.YELLOW)
        }
    }
}

PROBLOG:

这里的问题是,在第一次点击时,我可以同时切换按钮1和按钮2(两个都是真),即使我将一个按钮设置为假,另一个按钮设置为真。之后,一切都很好。

我试着在调用函数之前,在我的活动中把按钮1设置为true,把按钮2设置为false,但也没有成功。

谢谢你的帮助

android kotlin android-widget oncheckedchanged
1个回答
1
投票

我认为使用 OnCheckedChangeListener 来切换另一个按钮,这将是一个很难解决的问题,因为当其中一个按钮被切换时,它会想切换另一个按钮,从而使它想切换另一个按钮,如此往复。

由于你要改变颜色来匹配切换状态,所以用样式来处理会更加合适和稳健。创建一个像这样的StateListDrawable。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:drawable="@color/yellow" android:state_checked="true"/>
  <item android:drawable="@color/white"/>
</selector>

并将其设置为布局文件中两个按钮的背景,而不是显式颜色。

你还想将其中一个按钮的初始状态设置为checked。

android:checked="true"

让它们互相改变的简单方法 就是给它们每个按钮一个点击监听器来切换另一个按钮。

btn1.setOnClickListener { _ -> btn2.isChecked = !btn2.isChecked }
btn2.setOnClickListener { _ -> btn1.isChecked = !btn1.isChecked }

但在我看来,如果你需要这些元素保持同步,那么依靠UI元素来存储状态并不是一个好的做法。有一些UI行为可能会很微妙(比如双击一个启动Activity的Button的速度有多快,可以启动该Activity的两个副本)。所以我会把你的状态存储在一个属性中。你可以让它成为可观察的,所以每次改变它都会明确地设置两个按钮的切换状态。

private val buttonState by Delegates.observable(true) { _, _, newState ->
    btn1.isChecked = newState
    btn2.isChecked = !newState
}

//...

val listener = View.OnClickListener { _ -> buttonState = !buttonState }
btn1.onClickListener = listener
btn2.onClickListener = listener

1
投票

你需要附加一个 OnCheckedChangeListener 对两个 btn1btn2. 你只把它连接到 OnCheckedChangeListener. 而另一个的逻辑需要稍微不同。要么,你可以创建一个通用的 OnCheckedChangeListener 你可以附加到两个按钮上,但是你需要确定哪个按钮被点击了,这样你就可以执行正确的逻辑。在这里,你需要确定哪个按钮被点击了,这样你就可以执行正确的逻辑。View 作为参数传递给方法。

© www.soinside.com 2019 - 2024. All rights reserved.