我正在玩Android databinding library而我正试图将其与包含的布局一起使用。
我的代码是这样的:
activity_main.xml中
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id = "@+id/linearLayout">
<include
layout="@layout/view" />
</LinearLayout>
</layout>
view.xml用
<View xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id = "@+id/myView">
</View>
MainActivity.java
public MainActivity extends AppCompatActivity{
private ActivityMainBinding mBinding;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
LinearLayout layout = mBinding.linearLayout; // this field is visible
View myView = mBinding.myView // THIS FIELD IS NOT VISIBLE
}
}
正如我在评论中所写的那样,在“包含”布局中声明的视图myView是不可见的。如果我用view.xml中的实际代码替换,那么mBinding.myView变得可见,原因似乎是包含然后。
官方文件仅说明了
“数据绑定不支持包含为合并元素的直接子节点。” 但在我看来,View是LinearLayout的孩子,它不是一个直接的孩子..
任何提示?
答案 0 :(得分:16)
您需要为include语句提供ID:
<include android:id="@+id/included"
layout="@layout/view" />
现在您可以访问包含视图:
View myView = mBinding.included;
如果您包含的布局是绑定布局,则include将是生成的Binding。例如,如果view.xml是:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@{@android:color/black}"
android:id="@+id/myView"/>
</layout>
然后布局字段将是一个ViewBinding类:
View myView = mBinding.included.myView;