视图绑定随 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>
Run Code Online (Sandbox Code Playgroud)
我正在尝试引用 item_header 布局内的项目。
binder.my_header (<-- this just returns back the view)
binder.root (<-- this just returns back the root view)
Run Code Online (Sandbox Code Playgroud)
即使我向 item_header 的根添加一个 id,例如 id="@+id/parent_id" 并尝试引用它,我也会收到空指针异常
binder.parentId (<-- I have access to views inside of the item_header, however, I receive exceptions. Says that "parentId" cannot be found)
Run Code Online (Sandbox Code Playgroud)
如何参考布局,item_header?
Com*_*are 11
让我们假设您问题中的布局是activity_main.xml. 为它生成的视图绑定类是ActivityMainBinding. 同样,对于item_header.xml,生成的视图绑定是ItemHeaderBinding。
如果我们假设它item_header.xml有一个TextViewnamed @+id/foo,那么你最终会得到这块 Kotlin:
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"
}
}
Run Code Online (Sandbox Code Playgroud)
所以,ActivityMainBinding对象应该有一个属性android:id,你给了<include>-myHeader在这种情况下。那应该是ItemHeaderBinding,因为视图绑定似乎为<include>. 既然myHeader是ItemHeaderBinding,那么您就可以像直接给ItemHeaderBinding自己充气一样在其上引用小部件。
请注意,视图绑定似乎转换lower_snake_case为lowerCamelCase,因此根据生成的代码,my_headerID 变为myHeader。
我在Java中检查过这个问题。
活动主文件
<?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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
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");
}
}}
Run Code Online (Sandbox Code Playgroud)
我检查了它在我的新项目中是否有效。我希望它会有所帮助。
| 归档时间: |
|
| 查看次数: |
4750 次 |
| 最近记录: |