【发布时间】:2021-03-08 14:26:32
【问题描述】:
这是我的第一个安卓项目,
事实上是第一个编程项目。
我有一个 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:visibility 或 android:alpha 呢?
谢谢...
编辑
问题解决了,我的答案和 Henry Twist 的都是正确的,
我个人更喜欢 Henry 的方法,因为它更容易实现和维护。
【问题讨论】:
-
您的视图必须在某处成为 Activity 的一部分,因此您可以通过编程方式完成,而不是在 ViewModel 中。
-
只是需要考虑的事情,这是一个很好的例子,说明了为什么我不喜欢自己绑定到 ViewModels。视图现在在更多地方被操纵,这实际上使事情复杂化了。不要将视图绑定到 ViewModel;直接在片段或活动中操作它。
-
@eimmer 我必须在 ViewModel 中执行此操作的原因是状态变量和 onClick 连接到 ViewModel 中维护的数据库调用
-
@OsamaOmar 我理解,但是 ViewModel 可以更新一个值,将该值公开给活动/片段,然后可以从那里更新视图。 IMO,将所有动态值设置在 1 个位置使维护更容易。
-
@eimmer 是的,我同意,但我对编码非常陌生。当我提出问题时,不知道如何准确观察暴露值的变化。但正如您在我发布的答案中看到的那样,我想出了如何使用观察者对象来做到这一点。当然,这不是我解决的问题,最后我使用了 Henry 的 xml 方法,现在我坚持在 ViewModel 中拥有所有动态值并使用 xml lambdas 控制 UI
标签: android android-studio android-layout kotlin android-fragments