如何用View Binding替代ButterKnife?Android应用适配求助
ButterKnife 转 View Binding 适配指南:双选项弹窗改造
一、开启View Binding支持
首先在模块级 build.gradle(或build.gradle.kts)中开启View Binding:
android { ... buildFeatures { viewBinding true } }
同步项目后,系统会自动为布局文件dialog_two_button.xml生成对应的绑定类DialogTwoButtonBinding。
二、XML布局无需修改
原布局文件保持不变,View Binding会自动识别布局中的所有控件ID。
三、Java类适配修改
1. 移除ButterKnife相关依赖与注解
删除所有butterknife相关的导入语句,以及@BindView、@OnClick注解。
2. 引入View Binding类
添加自动生成的Binding类导入:
import com.example.databinding.DialogTwoButtonBinding;
3. 替换控件引用方式
将原@BindView声明的控件变量,改为通过Binding对象获取。
4. 替换点击事件绑定
将@OnClick注解的方法,改为通过Binding对象为控件手动设置点击监听。
5. 修改初始化逻辑
在onCreate中初始化Binding对象,替代ButterKnife.bind(this),并通过Binding对象操作控件。
完整修改后的Java代码
import android.content.Context; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.View; import androidx.annotation.NonNull; import com.example.R; import com.example.databinding.DialogTwoButtonBinding; import com.example.interfase.MyClickHolder; public class TowOptionDialog extends BaseDialog { private String noButtonText, yesButtonText, titleText, bodyText; private Drawable imageLink; private MyClickHolder myClickHolde; // 声明View Binding对象 private DialogTwoButtonBinding binding; public void setMyClickHolde(MyClickHolder myClickHolde) { this.myClickHolde = myClickHolde; } public TowOptionDialog(@NonNull Context context, String noButtonText, String yesButtonText, String titleText, String bodyText, Drawable imageLink) { super(context); this.noButtonText = noButtonText; this.yesButtonText = yesButtonText; this.titleText = titleText; this.bodyText = bodyText; this.imageLink = imageLink; } public TowOptionDialog(@NonNull Context context, String titleText, String bodyText ) { super(context); this.noButtonText = "No"; this.yesButtonText = "Yes"; this.titleText = titleText; this.bodyText = bodyText; this.imageLink = null; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 初始化Binding对象 binding = DialogTwoButtonBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); // 通过Binding对象操作控件 binding.baseDialogTvTitle.setText(titleText); binding.baseDialogTvDescription.setText(bodyText); binding.baseDialogImgDialog.setImageDrawable(imageLink); binding.baseDialogImgDialog.setVisibility(imageLink == null ? View.GONE : View.VISIBLE); binding.baseDialogBtnYes.setText(yesButtonText); binding.baseDialogBtnNo.setText(noButtonText); // 设置点击事件 binding.baseDialogBtnYes.setOnClickListener(v -> { if (myClickHolde != null) { myClickHolde.onClicked(null, 1); } dismiss(); }); binding.baseDialogBtnNo.setOnClickListener(v -> dismiss()); } }
补充说明
- View Binding生成的类名是布局文件名的驼峰式写法,比如
dialog_two_button.xml对应DialogTwoButtonBinding - 控件ID同样转为驼峰式,比如
baseDialog_tvTitle对应baseDialogTvTitle - 新增
myClickHolde空判断,避免空指针异常
内容的提问来源于stack exchange,提问作者Ali Hosein pour
相关产品推荐
相关产品推荐

