[Android]一些细节注意点和代码

随时更新一些编写应用中遇到的细节注意点

  • 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. 关于权限:
    关于targetSdkVersion

  • 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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值