这是我的第一个android项目,
事实上第一个编程项目。
我有一个ImageButton我想要隐藏当被禁用,启用/禁用状态是使用到视图模型的xml连接完成的。所以我不能引用片段来编程地做它。
我尝试使用一个选择器列表来传递一个灰色版本的图像,但我想完全隐藏按钮,而不仅仅是src图像。
片段布局中的按钮:
<ImageButton
android:id="@+id/work_button"
android:src="@drawable/ic_desktop_windows_black"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:enabled="@{timerViewModel.pcButtonState}"
android:onClick="@{() -> timerViewModel.activityTypeWork()}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/gaming_button"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.40"
tools:ignore="ContentDescription" />
控制禁用/启用状态的变量:
val pcButtonState = Transformations.map(lastSession){
it == null
}
这样做是为了使按钮只有在最后一次会话为空时才启用
所以有任何方式来控制android:可视性或android:alpha通过一个选择器,或什么?
谢谢…
编辑
问题解决了,我的答案和Henry Twist的答案都是正确的,
我个人更喜欢Henry的方法,因为它更容易实现和维护。
我不认为有必要使解决方案如此复杂,如果一个按钮应该在禁用时隐藏,在启用时可见,你不需要使用启用/禁用状态,你可以只设置可见性依赖于timerViewModel.pcButtonState
。
例如:
android:enabled="true"
android:visibility="@{timerViewModel.pcButtonState ? View.VISIBLE : View.GONE}"
编辑
为了在数据绑定中使用外部类,您必须在data
标记中导入它们,因此:
<data>
<import type="android.view.View" />
</data>
就是这样,如果其他人遇到类似的奇怪情况
我找到了一个解决方法,
通过在片段中设置一个观察者对象来观察控制状态的变量
val pcButton = binding.pcButton
timerViewModel.pcButtonState.observe(viewLifecycleOwner, Observer { state ->
state.let {
if (it == true) {
binding.pcButton.visibility = View.VISIBLE
}
}
})
现在我可以根据变量
的状态以编程方式调整按钮属性