ButterKnife → ViewBinding
老写法(Java + ButterKnife)
public class MainActivity extends AppCompatActivity {
@BindView(R.id.tv_title) TextView tvTitle;
@BindView(R.id.btn_submit) Button btnSubmit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
tvTitle.setText("Hello");
}
@OnClick(R.id.btn_submit)
public void onSubmit() {
// 处理点击
}
}
问题在哪里
ButterKnife 已停止维护,作者 Jake Wharton 自己也不建议继续使用。依赖注解处理器,每次 build 生成大量中间代码,编译速度慢。不支持 Kotlin(虽然有 kotlin-annotation-processing,但体验很差)。
新写法(ViewBinding)
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.tvTitle.text = "Hello"
binding.btnSubmit.setOnClickListener { onSubmit() }
}
}
一句话注意
迁移重点:@BindView 声明全删掉,用 binding.tvTitle 直接访问。@OnClick 的方法体搬到 setOnClickListener lambda 里。不需要注解处理器,编译速度明显变快。
ButterKnife 的 @BindViews(多个 ID 绑定到 List)在 ViewBinding 里没有直接等价物,用单个 binding 引用解决。@BindColor / @BindDimen 之类的资源绑定用 context.resources.getColor() 等标准 API 替代。
Java Android 老项目迁移系列,持续更新中。