目录
前言
官网示例
封装
ViewBinding可以帮助我们减少代码中的大部分findViewById,官网中提到了它的优点和缺点:
@Nullable
标记。详情请看官网说明:视图绑定 | Android 开发者 | Android Developers
官网提供了在Fragment中使用的例子,如下:
private ResultProfileBinding binding;@Overridepublic View onCreateView (LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {binding = ResultProfileBinding.inflate(inflater, container, false);View view = binding.getRoot();return view;}@Overridepublic 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 extends Fragment {private T binding;@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {// 调用onCreateViewBinding方法获取bindingbinding = onCreateViewBinding(inflater, container);return binding.getRoot();}@Overridepublic void onDestroyView() {super.onDestroyView();// 引用置空处理binding = null;}// 子类使用该方法来使用bindingpublic T getBinding() {return binding;}// 由子类去重写protected abstract T onCreateViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup parent);
}
基类使用示例:
// 注意加上泛型
public class HomeFragment extends BaseBindingFragment {// 重写基类的方法@Overrideprotected FragmentHomeBinding onCreateViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup parent) {return FragmentHomeBinding.inflate(inflater, parent, false);}@Overridepublic 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
👍点赞,你的认可是我创作的动力 !
🌟收藏,你的青睐是我努力的方向!
✏️评论,你的意见是我进步的财富!