赞
踩
目录
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<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
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/319870
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。