【问题标题】:How to make an ImageButton disappear when disabled using only xml?仅使用 xml 禁用时如何使 ImageButton 消失?
【发布时间】: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


【解决方案1】:

我认为没有必要让解决方案变得如此复杂,如果一个按钮在禁用时隐藏而启用时可见,则根本不需要使用启用/禁用状态,你可以设置依赖于timerViewModel.pcButtonState的可见性。

例如:

android:enabled="true"
android:visibility="@{timerViewModel.pcButtonState ? View.VISIBLE : View.GONE}"

编辑

为了在数据绑定中使用外部类,您必须在 data 标记中导入它们,所以:

<data>

    <import type="android.view.View" />
</data>

【讨论】:

  • 对于 noop 问题我很抱歉,我对这一切真的很陌生。但这应该去哪里?在片段布局文件“视图”中给出了错误。实际上,我自己找到了另一个解决方案,我将发布,但我也想了解您的解决方案......
  • 非常感谢,外部类数据导入对我来说是全新的 ^^ 可以确认我们的解决方案都能完美运行。我会接受你的,因为好运动 UwU(开玩笑,因为它的代码效率更高:D)
【解决方案2】:

就是这样,如果其他人遇到类似的奇怪情况

我找到了解决方法,

通过在片段中设置观察者对象来观察控制状态的变量

val pcButton = binding.pcButton
      
        timerViewModel.pcButtonState.observe(viewLifecycleOwner, Observer { state ->
            state.let {
                if (it == true) {
                    binding.pcButton.visibility = View.VISIBLE
                }
            }
        })

现在我可以根据变量的状态以编程方式调整按钮属性

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多