您应该做几件事,我尝试将其组织起来并列出:(基于此链接中的 Android 开发人员文档和我的个人经验)
您需要使用 Android Studio 3.6 canary11+(我目前正在使用 Android Studio 4,它对我来说做得很好)
你可以从这里找到它:
https ://developer.android.com/studio/archive
您需要将 Gradle 包装器升级到 Gradle“5.6.4”,将 Gradle 构建工具升级到“3.6.0-rc01”,更高版本也可以使用,所以不要害怕更新
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
dependencies {
...
classpath 'com.android.tools.build:gradle:3.6.0-rc01'
}
- 要在模块中启用视图绑定,请将 viewBinding 元素添加到其 build.gradle 文件中,如下例所示:
android {
...
viewBinding {
enabled = true
}
}
- 如果您希望在生成绑定类时忽略布局文件,请将
tools:viewBindingIgnore="true"
属性添加到该布局文件的根视图:
<LinearLayout
...
tools:viewBindingIgnore="true" >
...
</LinearLayout>
如果为模块启用了视图绑定,则会为模块包含的每个 XML 布局文件生成一个绑定类。每个绑定类都包含对根视图和所有具有 ID 的视图的引用。绑定类的名称是通过将 XML 文件的名称转换为驼峰式并在末尾添加单词“Binding”来生成的。
例如,给定一个名为的布局文件result_profile.xml
:
<LinearLayout ... >
<TextView android:id="@+id/name" />
<ImageView android:cropToPadding="true" />
<Button android:id="@+id/button"
android:background="@drawable/rounded_button" />
</LinearLayout>
生成的绑定类称为ResultProfileBinding
. 这个类有两个字段:一个TextView
被调用的name
和一个Button
被调用的button
。布局中的ImageView
没有ID,所以绑定类中没有对它的引用。
每个绑定类还包含一个getRoot()
方法,为相应布局文件的根视图提供直接引用。在此示例getRoot()
中,类中的方法ResultProfileBinding
返回LinearLayout
根视图。
- 要设置绑定类的实例以与活动、片段或卡片视图适配器一起使用,请执行以下步骤:
private ResultProfileBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ResultProfileBinding.inflate(getLayoutInflater());
View view = binding.getRoot();
setContentView(view);
}
private FragmentHousesBinding binding;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
binding = FragmentHousesBinding.inflate(inflater, container, false);
init();
return binding.getRoot();
}
- 在卡片视图适配器的 onCreateViewHolder() 方法中:
HouseCardPropertyFragmnetBinding binding;
@Override
public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
binding = HouseCardPropertyFragmnetBinding.inflate(LayoutInflater
.from(parent.getContext()), parent, false);
return new Holder(binding);
}
@Override
public void onBindViewHolder(@NonNull HouseAdapter.Holder holder, int position) {
holder.bindData(getItem(position));
}
class Holder extends RecyclerView.ViewHolder {
HouseCardPropertyFragmnetBinding view;
Holder(@NonNull HouseCardPropertyFragmnetBinding v) {
super(v.getRoot());
view = v;
}
void bindData(Tag item) {
view.tagTxt.setText(item.Name);
}
}
就是这样,findViewById
从现在开始你就可以自由了;)