目录
前言
官网示例
封装
前言
ViewBinding可以帮助我们减少代码中的大部分findViewById,官网中提到了它的优点和缺点:
- Null 安全:由于视图绑定会创建对视图的直接引用,因此不存在因视图 ID 无效而引发 Null 指针异常的风险。此外,如果视图仅出现在布局的某些配置中,则绑定类中包含其引用的字段会使用
@Nullable
标记。
- 类型安全:每个绑定类中的字段均具有与它们在 XML 文件中引用的视图相匹配的类型。这意味着不存在发生类转换异常的风险。
详情请看官网说明:视图绑定 | Android 开发者 | Android Developers
官网示例
官网提供了在Fragment中使用的例子,如下:
private ResultProfileBinding binding;
@Override
public View onCreateView (LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
binding = ResultProfileBinding.inflate(inflater, container, false);
View view = binding.getRoot();
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
使用:
binding.getName().setText(viewModel.getName());
binding.button.setOnClickListener(new View.OnClickListener() {
viewModel.userClicked()
});
可以看到官网给出的例子中在onDestroyView里对binding进行了置空处理,如果不进行置空处理可能会导致内存泄露的风险,那么问题来了,我要是有很多个Fragment的话,我总不能每个都加上onDestroyView吧,就算我全部都加上了,没法保证不会漏加,因此我们可以封装一个基类,让其余的Fragment集成于该基类,引用置空统一在基类进行!
封装
基类的封装如下:
public abstract class BaseBindingFragment<T extends ViewBinding> extends Fragment {
private T binding;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// 调用onCreateViewBinding方法获取binding
binding = onCreateViewBinding(inflater, container);
return binding.getRoot();
}
@Override
public void onDestroyView() {
super.onDestroyView();
// 引用置空处理
binding = null;
}
// 子类使用该方法来使用binding
public T getBinding() {
return binding;
}
// 由子类去重写
protected abstract T onCreateViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup parent);
}
基类使用示例:
// 注意加上泛型
public class HomeFragment extends BaseBindingFragment<FragmentHomeBinding> {
// 重写基类的方法
@Override
protected FragmentHomeBinding onCreateViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup parent) {
return FragmentHomeBinding.inflate(inflater, parent, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// 调用getBinding()使用
getBinding().getTvHelloWord().setText("Hello Android!");
}
}
参考文章:
DocumentDescriptionhttps://dylancaicoding.github.io/ViewBindingKTX/#/zh/baseclass?id=fragment-1
👍点赞,你的认可是我创作的动力 !
🌟收藏,你的青睐是我努力的方向!
✏️评论,你的意见是我进步的财富!