我有一个视图,该视图使用DataBinding
来显示ViewModel
中的数据。视图处于横向模式时,该视图具有隐藏的按钮。目前,这通过具有两个layoutfiles起作用,但是我只想拥有一个,因为它是重构的噩梦。但是如何使用DataBinding
和BindingAdapters
来解决这个问题?
如何为给定视图启用以下绑定表达式?
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
答案 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一起使用时要小心。参见问题AndroidAnnotation和here。