【问题标题】:Android layout databinding won't workAndroid 布局数据绑定不起作用
【发布时间】:2017-04-20 07:30:10
【问题描述】:
我尝试在我的视图中动态隐藏/显示一个元素,因此我遵循了这个示例Dynamically toggle visibility of layout elements with Android data-binding.
我用
- Android Studio 2.3.1
- 编译SdkVersion 23
- buildToolsVersion '25.0.2'
- minSdkVersion 15
- targetSdkVersion 17
我的第一个问题是错误消息“属性缺少 Android 命名空间”,但我能找到的所有示例都没有提供命名空间
尽管如此,我还是尝试启动我的项目并得到另一个错误:
android:visibility="@{@bool/list_show_icon ? View.VISIBLE : View.GONE}"
Error:(22, 29) No resource found that matches the given name (at 'visibility' with value '@{@bool/list_show_icon ? View.VISIBLE : View.GONE}').
他似乎没有尝试评估表达式
【问题讨论】:
标签:
android
android-databinding
【解决方案1】:
在layout 标签内添加你的根LinearLayout
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<import type="android.view.View"/>
</data>
<LinearLayout>
</LinearLayout>
</layout>
【解决方案2】:
使用DataBinding的第一条规则是你的XML的根元素必须是<layout>
是<layout> 的一部分,而不是其他布局。你的情况应该是
<layout>
<data> </data>
<LinearLayout>
</LinearLayout>
</layout>
【解决方案3】:
正如 Kishore 已经写的那样。
必须是根元素并包装整个布局 + 数据。
它的
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<import type="android.view.View" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:attr/activatedBackgroundIndicator"
android:minHeight="56dp"
android:orientation="horizontal"
android:paddding="8dp">
</LinearLayout>
</layout>
无论如何,如果您使用数据绑定,我建议使用可观察的布尔值/整数,而不是在布局中使用可见性逻辑。这可以使用 ViewModel 来解决,例如
<data>
<variable name="viewModel" type="YourViewModelClass" />
</data>
<LinearLayout> ... <TextView android:visibility="@{viewModel.isVisible}" />
</LinearLayout>
并在您的 ViewModel (mvvm) 中使用:
private boolean ObservableInt isVisible = new ObservableInt(View.GONE);
private void changeVisibility(boolean visible) { isVisible.set( visible ? View.VISIBLE : View.Gone); }
它只是更清洁,但不影响性能或其他任何东西。