Android(安卓)EditText常用技能,包括clearFocus(),软键盘在界面开启关闭,点击关闭软键盘的问题
16lz
2021-01-24
本篇文章将介绍Android中EditText的常用技能。
1.解决初次进入界面就弹出软件盘的问题:
首先产生该原因的根本原因是该EditText默认的获取了焦点了。
法1(不推荐):
强制不让其弹出软件盘
Mainfest.xml 设置属性
Activity中onCreate()设置
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Android避免进入页面EditText自动弹出软键盘 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); }
该方法解决了不弹出软键盘,但是EditText 仍然获取了焦点了,效果是未弹出软键盘但光标仍然在闪
法2(推荐):
转移焦点,利用clearFocus()方法变相让其失去焦点,需要注意的是应当尽可能的转移到其父组件上
xml中,设置父组件可以获得焦点
在activity中:
清除该EditText的焦点即可。
@Override protected void onResume() { super.onResume(); mEtContent.clearFocus(); }
该方法效果完美,而且易于实现。但是需要注意的是clearfocus之后就失去焦点了,也就不会响应点击事件,这个还是得权衡的
另外 view.requestFocus()是用户获取焦点的。mEditText.setCursorVisible(false)即设置光标不可见
当设置clearfocus()时,去点击编辑框,打印日志
/*做一下测试*/ mEtContent.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()){ case MotionEvent.ACTION_DOWN: Log.e("键盘", "ACTION_DOWN" ); break; case MotionEvent.ACTION_MOVE: Log.e("键盘", "ACTION_MOVE" ); break; case MotionEvent.ACTION_UP: Log.e("键盘", "ACTION_UP" ); break; } return false; } }); mEtContent.setOnClickListener(view -> { Log.e("键盘", "OnClickListener" ); });
clearFocus()点击事件Log结果:
requestFocus()点击事件Log结果
比较发现:无焦点不响应点击事件
2. 解决在弹出软件盘时立即退出该界面会出现界面错位的问题
我们可能会遇到当弹出软键盘时,用户突然点击了标题栏的返回按钮,这时候假若是退出到Fragment直接finish掉会出布局错落的问题。这时候需要先关闭再退出,而这时候的问题是可能是同步的,问题依旧还是会有,这时可以加个肉眼看不到的延迟。
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); // 隐藏软键盘 imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0); // 延迟个0.1秒是因为 可能推出太快导致软键盘刚刚被回收,前面的界面出现断层 try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } finish();
嗯,很粗暴,但很管用啊。这里软键盘我直接关闭了也不太好,最好是可以判断下,但是貌似也没有特别好的api一定可以判断是弹出或者隐藏的,有时间做这个操作,直接关了岂不是更好呢。
3. 点击空白实现软键盘的隐藏
public static void hideKeyboard(MotionEvent event, View view, Activity activity) { try { if (view != null && view instanceof EditText) { int[] location = { 0, 0 }; view.getLocationInWindow(location); int left = location[0], top = location[1], right = left + view.getWidth(), bootom = top + view.getHeight(); // 判断焦点位置坐标是否在空间内,如果位置在控件外,则隐藏键盘 if (event.getRawX() < left || event.getRawX() > right || event.getY() < top || event.getRawY() > bootom) { // 隐藏键盘 IBinder token = view.getWindowToken(); InputMethodManager inputMethodManager = (InputMethodManager) activity .getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS); } } } catch (Exception e) { e.printStackTrace(); } }
@Override public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()){ case MotionEvent.ACTION_DOWN: View view = getCurrentFocus(); UIUtils.hideKeyboard(ev,view,SessionActivity.this); break; } return super.dispatchTouchEvent(ev); }
更多相关文章
- android点击空白处或者其他控件的时候隐藏软键盘
- 【Android(安卓)界面效果25】android中include标签的使用
- Android(安卓)初级面试者拾遗(前台界面篇)之 View 和 ViewGroup
- Android(安卓)基础:SharePreferences知识总结和在“登录”界面的
- Android应用程序四个构建模块
- Android写一个简单的欢迎界面
- Android(安卓)Studio和eclipse之间的不同
- Windows环境中集成Android4.x和Exclipse开发环境
- 【Android实战决】Android沉浸式状态栏实现(下)