我正在学习Kotlin,我想做两个可以切换的按钮,其特性如下。
拨动的按钮是黄色的,而未拨动的按钮是白色的。按钮 编码。
<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,但也没有成功。
谢谢你的帮助
我认为使用 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
你需要附加一个 OnCheckedChangeListener
对两个 btn1
和 btn2
. 你只把它连接到 OnCheckedChangeListener
. 而另一个的逻辑需要稍微不同。要么,你可以创建一个通用的 OnCheckedChangeListener
你可以附加到两个按钮上,但是你需要确定哪个按钮被点击了,这样你就可以执行正确的逻辑。在这里,你需要确定哪个按钮被点击了,这样你就可以执行正确的逻辑。View
作为参数传递给方法。