androidstudio的使用
(1)当代码中进行变量替换工作的时候(例如视图绑定把textviw改为binding.textview的时候)。直接Ctrl+R进行替换,提升效率。最好不要直接replace all,一个一个的替换会防止一些同名片段被替代。
(2)变量重命名时,例如把长变量xxxxxxBinding改为binding,首先不要逐一替换(吃力),也不要ctrl+R(这样没有考虑变量的使用的地方),安全的做法是 右击 refactor->rename,这样能把用到变量的地方,都改为新名称。
(3)追溯变量的数据源时,或者查看网络请求是否成功时,logcat和断点都是不错的选择,当然断点是在debug模式下
(4)快速定位变量的使用和源,类的使用或者源,ctrl+鼠标点击即可
(5)使用了数据库可视化工具时,出现app第二次进入总是闪退(非代码原因),那就清除缓存 file->invalidate Cachae/Restat,具体原因没有细纠
视图绑定
用java写安卓时,使用viewbinding代替butterknife,或者findViewByid
(一)Activity
下面展示一些 内联代码片
。
binding = ActivityBinding.inflate(getLayoutInflater());
view = binding.getRoot();
setContentView(view);
(二)Fragment
binding = ActivityBinding.inflate(inflater, container, false);
view = binding.getRoot();
return view
(三)Dialog
binding = DialogBinding.inflate(LayoutInflater.from(context));
View view = binding.getRoot();
setContentView(view);
(四)include
binding = ActivityBinding.inflate(getLayoutInflater());
/*
include根布局再添加id时,此时会报错:java.lang.NullPointerException: Missing required view with ID:***,所以根布局不能有id属性。即miss 子布局的根布局id
如果使用merge,会切断子布局和父布局的联系,即miss include 控件的·id
*/
actionbarBinding = binding.infoactionbar;
View view = binding.getRoot();
setContentView(view);
(五)MVP模式下的依赖倒置
/*
Activity
获取view对象的binding
*/
View View = new View(Activity.this);
setContentView(View.getBinding().getRoot());
/*
view
*/
定义私有变量 binding
binding =activityBinding.inflate(LayoutInflater.from(context));
Presenter = new IPresenter(context, this);
initView();
(六)子Fragment继承父Fragment(父布局中有初始化view操作)
/*
如果父fragment在oncreateView方法中调用了一些方法(例如初始化view),
且子fragment中super.oncreat父布局的oncreatview方法,那么我们的绑定就要在super.oncreatview之前完成,
否则,父布局初始化view时,我们没有viewbinding,就出错
*/
//oncreateview中
binding = FragmentBinding.inflate(inflater,container,false);
//在super之前,否则进行初始化时,binding还是为空
super.onCreateView(inflater, container, savedInstanceState);
//父布局中有initview操作(虽然该方法在子布局中会重写)
return binding.getRoot();
//记得在destory中,让binding为空
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
(七)适配器/recycleView
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
binding =ItemBinding.inflate(LayoutInflater.from(parent.getContext()),parent,false);
return new Holder(binding);
}
/*
一般是 return new Holder(view);
然后其他地方 holder.view.findViewById......
但是视图绑定,可以在holder类里面 定义 公有变量 binding this.binding=binding//后者binding为传入参数
这样就可以用binding代替其他地方的findViewById了 eg holder.binding.textView之类
*/
推荐阅读链接: https://louyu.cc/friends/.