使用数据绑定时如何在横向模式下隐藏按钮

时间:2019-01-18 10:39:07

标签: android android-databinding

我有一个视图,该视图使用DataBinding来显示ViewModel中的数据。视图处于横向模式时,该视图具有隐藏的按钮。目前,这通过具有两个layoutfiles起作用,但是我只想拥有一个,因为它是重构的噩梦。但是如何使用DataBindingBindingAdapters来解决这个问题?

如何为给定视图启用以下绑定表达式?

android:visibility="@{isLandscapeMode ? View.INVISIBLE : View.VISIBLE}"

编辑:

我的扩展程序属性定义(ViewUtils.kt):

val View.isLandscapeMode: Boolean
    get() = resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE

我的布局:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <import type="android.view.View"/>
        <import type="com.example.base.views.ViewUtilsKt" />
        <variable
            name="isLandscapeMode "
            type="java.lang.Boolean"/>
        <variable
            name="viewmodel"
            type="com.example.ui.task.TaskViewModel" />
    </data>

    ...

    <ImageButton
            ...
            android:visibility="@{isLandscapeMode ? View.INVISIBLE : View.VISIBLE}"
            ...
            />

这会导致编译错误:Cause: not a valid name: isLandscapeMode

2 个答案:

答案 0 :(得分:1)

您必须签入绑定适配器,当前正在使用哪个电话方向。这是另一篇文章,您可以在其中找到问题how to detect orientation of android device?

的答案

编辑:

您需要检测方向并将其保存为布尔值。稍后,您必须将该变量传递给适配器,在这种情况下,它将是布尔值。

<data>

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

<variable
    name="isLandscapeMode"
    type="boolean"/>

</data>

答案 1 :(得分:0)

对于其他人,如果他们需要相同的行为。有两种解决方案。

第一个解决方案(创建一个BindingAdapter并将其用于您选择的UI元素):

@BindingAdapter("bind:visibleInLandscapeMode")
fun View.setVisibleInLandscapeMode(visible: Boolean) {
    Timber.d("setVisibleInLandscapeMode() returns ${resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE}")
    visibility = if (visible && (resources.configuration.orientation != Configuration.ORIENTATION_LANDSCAPE)) VISIBLE else INVISIBLE
}

在您的XML布局中:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:bind="http://schemas.android.com/apk/lib/com.example">

    ...

    <ImageButton
        ...
        bind:visibleInLandscapeMode="false"
        ...
        />

第二个解决方案(创建一个可更改UI元素可见性的bindingexpression):

<ImageButton
    ...
    android:visibility="@{context.getResources.getConfiguration.orientation == Configuration.ORIENTATION_LANDSCAPE ? View.INVISIBLE : View.VISIBLE}"
    ...
    />

记住正确的导入:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <import type="android.view.View"/>
        <import type="android.content.res.Resources" />
        <import type="android.content.res.Configuration" />
        ...
    </data>
    ...

顺便说一句。将数据绑定与https://flutterwavedevelopers.readme.io/docs/events-webhooks一起使用时要小心。参见问题AndroidAnnotationhere