视图绑定随v3.6一起发布。
文档: https://developer.android.com/topic/libraries/view-binding
我的问题是,有人知道如何在包含的布局中使用视图绑定吗?
给出包含另一个布局的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
android:id="@+id/my_header"
layout="@layout/item_header"
android:layout_width="match_parent"
android:layout_height="100dp" />
</LinearLayout>
我正在尝试引用item_header布局内的项目。
binder.my_header (<-- this just returns back the view)
binder.root (<-- this just returns back the root view)
即使我在item_header的根目录中添加一个id,例如id =“ @ + id / parent_id”并尝试引用该ID,我也会收到空指针异常
binder.parentId (<-- I have access to views inside of the item_header, however, I receive exceptions. Says that "parentId" cannot be found)
如何引用布局item_header
?
答案 0 :(得分:9)
让我们假设您的问题的布局为activity_main.xml
。为其生成的视图绑定类为ActivityMainBinding
。同样,对于item_header.xml
,生成的视图绑定为ItemHeaderBinding
。
如果我们假装item_header.xml
有一个名为TextView
的{{1}},那么您会发现这段Kotlin:
@+id/foo
因此,在这种情况下,class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val mainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(mainBinding.root)
mainBinding.myHeader.foo.text = "this is a test"
}
}
对象应该具有您赋予ActivityMainBinding
— android:id
的{{1}}的属性。这应该是<include>
,因为视图绑定似乎为myHeader
设置了嵌套的绑定对象。由于ItemHeaderBinding
是<include>
,因此您可以像直接将myHeader
夸大自己一样引用其上的小部件。
请注意,视图绑定似乎将ItemHeaderBinding
转换为ItemHeaderBinding
,因此,根据生成的代码,lower_snake_case
ID变成了lowerCamelCase
。
答案 1 :(得分:3)
我已经用Java检查了这个问题。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
android:id="@+id/my_header"
layout="@layout/item_header"
android:layout_width="match_parent"
android:layout_height="100dp" />
</LinearLayout>
item_header.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="false"
android:background="@android:color/transparent">
<TextView
android:id="@+id/foo"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>
MainActivity.java
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.example.myapplication.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
binding.myHeader.foo.setText("this is a test");
}
}}
我检查了它在我的新项目中是否有效。 希望对您有所帮助。