随时更新一些编写应用中遇到的细节注意点
- 1 . 对返回键的处理,如实现长按返回键退出:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
Toast.makeText(this, "长按返回键退出", Toast.LENGTH_SHORT).show();
} else if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 2) {
//do something else
System.exit(0);
}
return false;
}
一些键(MediaKey,BackKey)在系统分发时,做了特殊处理:当按下时,发送Message去调用KeyEvent.changeTimeRepeat。长按时会发多次调用DOWN。经过对event.getRepeatCount()==0的判断,可以避免长按多次调用onKeyDown
-
2. 使用DialogFragment需要注意,当使用setStyle方法设置DialogFragment的显示尺寸时,会丢失Fragment的View的根布局(root),所以需要将xml布局文件外再套一层wrap_content的根布局
-
3. 一个匹配100000以内实数(小说点后一位、两位的浮点数或者整数)或者以小数点为结尾的字符串 = ^(\d){1,5}(.([0-9]|\d[0-9]){0,1})?$ 其中{1,5}的数字意味着最小1位最大5位数字,可以根据需要自行更换。其中{0,1}的数字意味着可以有小数点也可以不要小数点
-
4. RecyclerView在局部刷新时入调用notifyItemRangeChanged等方法时必须给Adapter重写getItemId方法,原因是Adapter会调用该方法将Item和position绑定起来,如果没有重写会导致复用的Item没有调用onBindViewHolder方法进而无法更新数据
-
5. ViewPager中添加View的高度必须确定,否则会导致View显示不全的问题,不能使用match_parent或者wrap_content
-
6. 手指点击和键盘OK键点击都会触发OnClick事件,但是这两种触发方式的触发起点是不同的,手指点击是通过dispatchTouchEvent传递下去的,而键盘OK键是通过dispatchKeyEvent传递下去的。同时需要了解,dispatchKeyEvent事件会判断当前屏幕中是否有聚有焦点(hasFocuse)的View存在,如果不存在则不会继续走onKeyDown事件
-
7. 设置ViewGroup(ListView或RecyclerView)完全展开的代码:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec
, MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST));
}
- 8. 更合理的MVP代码结构:
M(Model):数据封装模块和业务逻辑模块。用于对数据进行直接处理,并且实施主要业务逻辑
V(View):视图展示和监听注册。用于直接展示试图,设置事件监听器
P(Presenter):处理视图发出的请求以及控制业务流程。作为M和V的纽带,处理试图发出的请求,控制试图事件的处理,将M层的数据返回P层
-
9. 关于权限:
-
10. 关于编译Task报错:
类似于“aapt”之类的错误,复制报错的Task名称,在控制台输入脚本:
gradlew Task名称 -debug
编译完成后可以根据失败的原因去处理,可能是少了某个资源文件,也有可能是资源文件有错 -
11. 关于SurfaceView初始化闪烁:
SurfaceView有自己的缓冲以及数据存取机制,系统对他有特殊处理。当SurfaceView第一次在当前Activity上添加的时候,系统会给WindowManager重新排布局,relayout,这样就会黑一下,这个只会出现在第一次,以后再添加SurfaceView时就不会黑屏了。
SurfaceView sfvTrack = (SurfaceView)findViewById(R.id.sfvTrack);
sfvTrack.setZOrderOnTop(true);
SurfaceHolder sfhTrackHolder = sfvTrack.getHolder();
sfhTrackHolder.setFormat(PixelFormat.TRANSPARENT);