视图连续点击控制
之前常见的做法是重写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());
}
}
});
}
以上仅为特别简单的知识点总结,下一版会把目前使用的第三方总结一下