目录
ViewBinding可以帮助我们减少代码中的大部分findViewById,官网中提到了它的优点和缺点:
@Nullable 标记。详情请看官网说明:视图绑定 | 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
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
{ -
- // 重写基类的方法
- @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!");
- }
- }
参考文章:
DocumentDescription
https://dylancaicoding.github.io/ViewBindingKTX/#/zh/baseclass?id=fragment-1
👍点赞,你的认可是我创作的动力 !
🌟收藏,你的青睐是我努力的方向!
✏️评论,你的意见是我进步的财富!