Android中EditText焦点问题
2017-11-14 16:22
190 查看
取自http://www.jianshu.com/p/3d31d681f4bc
做下记录 备忘
场景:用户编辑
问题远没有看着那么简单哦
第一步:添加焦点监听
第二步:点击空白地方时关闭软键盘
在Activity中使用以下代码:
加入以上代码你惊喜的发现问题貌似完美的解决了。但是,如果你的界面中有多个EditText,你会发现当点击第一个EditText时,第二个EditText会有光标闪以下,或者点击第二个或者之后的EditText,第一个EditText会有光标闪一下。通过Log你会发现从第二次点击EditText起,每次点击EditText都会先触发一次失去焦点,再触发一次获取焦点。由此可以推断当存在多个EditText时,一个EditText失去焦点会触发另一个获取焦点。这问题必须解决,而且出现屏幕光标闪动影响用户体验。
第三步:避免另一个EditText获取焦点
解决这个问题的做法是在同一个XML中将一个不会有响应的控件(如TextView)设置如下属性:
做下记录 备忘
问题:当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; }
加入以上代码你惊喜的发现问题貌似完美的解决了。但是,如果你的界面中有多个EditText,你会发现当点击第一个EditText时,第二个EditText会有光标闪以下,或者点击第二个或者之后的EditText,第一个EditText会有光标闪一下。通过Log你会发现从第二次点击EditText起,每次点击EditText都会先触发一次失去焦点,再触发一次获取焦点。由此可以推断当存在多个EditText时,一个EditText失去焦点会触发另一个获取焦点。这问题必须解决,而且出现屏幕光标闪动影响用户体验。
第三步:避免另一个EditText获取焦点
解决这个问题的做法是在同一个XML中将一个不会有响应的控件(如TextView)设置如下属性:
android:focusable="true" android:focusableInTouchMode="true"
相关文章推荐
- Android EditText不弹出输入法焦点问题的总结
- Android EditText不弹出输入法总结,焦点问题的总结
- Android开发之ListView+EditText-要命的焦点和软键盘问题解决办法
- Android开发之ListView+EditText-要命的焦点问题终极解决方案
- Android EditText不弹出输入法焦点问题的总结
- 【Android开发那点破事】Android EditText不弹出输入法焦点问题
- 【Android】ListView中EditText焦点问题
- Android 相关知识 EditText焦点相关问题
- Android开发中EditText获得焦点弹出输入框改变屏幕布局的问题
- android的EditText重新获取焦点问题
- Android EditText不弹出输入法焦点问题的总结
- 【Android】ListView中EditText焦点问题
- Android EditText不弹出输入法焦点问题的总结
- android之EditText焦点问题
- android关于EditText取消默认焦点及触摸其它地方去掉光标隐藏键盘问题
- Android的EditText自动获取焦点并弹出输入法问题
- Android EditText不弹出输入法总结,焦点问题的总结
- Android EditText不弹出输入法焦点问题的总结
- Android EditText不弹出输入法焦点问题的总结
- Android开发之ListView+EditText-要命的焦点和软键盘问题解决办法