古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。这篇文章主要讲述Android中EditText焦点问题相关的知识,希望能为你提供帮助。
https://www.jianshu.com/p/3d31d681f4bc
问题:当EditText失去焦点时做内容校验
场景:用户编辑EditText
将内容清空,当点击空白地方时关闭软键盘,同时校验EditText
的内容,如果为空则设为"1"。
问题远没有看着那么简单哦
第一步:添加焦点监听
view.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(!hasFocus){
Log.d("Tag","lose focus");
if(TextUtils.isEmpty(((EditText)v).getText().toString().trim())){
view.setText("1");
}
}else {
Log.d("Tag","get focus");
}
}
});
第二步:点击空白地方时关闭软键盘在Activity中使用以下代码:
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View v = getCurrentFocus();
if (isShouldHideInput(v, ev)) {InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
return super.dispatchTouchEvent(ev);
}
// 必不可少,否则所有的组件都不会有TouchEvent了
if (getWindow().superDispatchTouchEvent(ev)) {
return true;
}
return onTouchEvent(ev);
}public boolean isShouldHideInput(View v, MotionEvent event) {
if (v != null &
&
(v instanceof EditText)) {
int[] leftTop = {0, 0};
//获取输入框当前的location位置
v.getLocationInWindow(leftTop);
int left = leftTop[0];
int top = leftTop[1];
int bottom = top + v.getHeight();
int right = left + v.getWidth();
if (event.getX() >
left &
&
event.getX() <
right
&
&
event.getY() >
top &
&
event.getY() <
bottom) {
// 点击的是输入框区域,保留点击EditText的事件
return false;
} else {
//使EditText触发一次失去焦点事件
v.setFocusable(false);
//v.setFocusable(true);
//这里不需要是因为下面一句代码会同时实现这个功能
v.setFocusableInTouchMode(true);
return true;
}
}
return false;
}
【Android中EditText焦点问题】加入以上代码你惊喜的发现问题貌似完美的解决了。但是,如果你的界面中有多个
EditText
,你会发现当点击第一个EditText
时,第二个EditText
会有光标闪以下,或者点击第二个或者之后的EditText
,第一个EditText
会有光标闪一下。通过Log你会发现从第二次点击EditText
起,每次点击EditText
都会先触发一次失去焦点,再触发一次获取焦点。由此可以推断当存在多个EditText
时,一个EditText
失去焦点会触发另一个获取焦点。这问题必须解决,而且出现屏幕光标闪动影响用户体验。第三步:避免另一个EditText获取焦点解决这个问题的做法是在同一个XML中将一个不会有响应的控件(如
TextView
)设置如下属性:android:focusable="true"
android:focusableInTouchMode="true"
作者:会飞的大象
链接:https://www.jianshu.com/p/3d31d681f4bc
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
推荐阅读
- android 集成友盟分享之后,想自定义分享面板的看过来
- 整合mybaties逆向生成 pojomapper.xml
- android控件获取 获取焦点
- Android Studio 快捷键Debug的使用
- 星云链提交DApp获得六千元奖励
- Android 组件化方案探索与思考
- 论文翻译MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
- Perl多维数组
- Perl模块和命名空间