android使用小结(上)----2015

  • 视图连续点击控制

    之前常见的做法是重写onClickListener,这样的对当有少量view时控制有效,并且是在前期就已经有这样方面的设计;如果在项目的后期才想起对view进行控制,那就死了,那么多的view要是都重新setOnClickListener(new MyClickListener())的话,是极不可取的。所以通过对顶层焦点进行分发,则避免了这种问题。

     /**
     * 最小的点击延时时间,单位:毫秒
     */
    private static final long MIN_CLICK_DELAY_TIME = 500;
     @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        //为了防止快速点击按钮,导致点击事件多次触发,这里判断两次点击的时间       是否在合理范围,否则直接拦截touch事件分发
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            long time = System.currentTimeMillis();
            long delta = time - mLastClickTime;
            if (delta < MIN_CLICK_DELAY_TIME) {
                return true;
            } else {
                mLastClickTime = time;
            }
        }
        return super.dispatchTouchEvent(ev);
    }
  • 判断是否有虚拟按键(不是输入按键!!!)

    现在市面上有不少android手机都为了扩大屏幕显示比取消了物理按键,转而使用更灵活的虚拟按键。但是这样就会造成了一种现象,就是当用户设置为展示虚拟按键时,就会有可能影响现有的屏幕适配,造成显示不全的情况;所以在特定情景下,就要判断按键是否弹出,以此来进一步进行适配:

     int mThreshold=100;
    // 适配虚拟键盘
        View decoreView = getWindow().getDecorView().findViewById(android.R.id.content);       decoreView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                //比较Activity根布局与当前布局的大小
                //添加mIsFirst变量是为了防止多个视图重复调用
                if (mIsFirst) {
                    mIsFirst = false;
                    int heightDiff = decoreView.getRootView().getHeight() -       decoreView.getHeight();
                    if (heightDiff > mThreshold) {
                        //大小超过100时,一般为显示虚拟键盘事件
                       //一般进行重新适配操作,如控制padding,margin等
                    } else {
                        //大小小于100时,为不显示虚拟键盘或虚拟键盘隐藏
                    }
                }
            }
        });
    }

//为了更规范的判断mThreshold,可以更分辨率合起来使用
private int getThreshold(){
      float density=getResources().getDisplayMetrics().density;
    return (int)45*density;
}
  • Calendar类使用注意点

    . format格式中,如果小时为12小时制(hh,当只写一个h时,表示当第一位 为0时不显示,只显示非0数据;HH,24小时制,0-23点,H同理),则转成的格式是1点到12点,就会造 成凌晨0点到1点和中午12点到1点之前的混乱,使用是切记分开
    . Calendar.DAY_OF_WEEK表示一周中的周几,从SUNDAY开始,马丹,关键是此值竟然是1,不是0!!!

  • 控制EditText输入为大小写,数字等

    其实思路特别简单,第一种就是先控制digits属性(android:digits=”0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLIMNOPQRSTUVWXYZ”);第二种是更改TextWatcher中的内容。

     //监听信息输入,并把字母转换成大写
    private void watchEditTextChanged(EditText editText) {
        editText.addTextChangedListener(new TextWatcher() {
            String temp;
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            }
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            }
            @Override
            public void afterTextChanged(Editable editable) {
                assert editable != null;
                String value = editable.toString();
                if (!TextUtils.isEmpty(value) && !value.equalsIgnoreCase(temp)) {
//                    放在editText.setText(...)后面会造成StackOverflowError,因为每次setText都会调用afterTextChanged,造成死循环
                    temp = value;
//                    转换大写
                    editText.setText(value.toUpperCase());
//                    光标定位到最后                    editText.setSelection(editText.getText().toString().length());
                }
            }
        });
    }

以上仅为特别简单的知识点总结,下一版会把目前使用的第三方总结一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值