You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:21:09