EditText 和软键盘常见用法
前因
产品有这样一个需求,一个输入框,刚开始进入页面的时候不获取焦点,第一次点击输入框光标到最后,后面再点击定位到具体文字,键盘收起来输入框失去焦点。
分析与实现
其实即使把 EditText
的使用方式组合起来,再监听一下软键盘的抬起,其中的一些小细节还是需要考虑的。
-
功能一:
EditText
刚进入见面的时候不获取焦点,不自动弹出键盘解决:在父布局 加上下面两个属性,获取焦点即可:
android:focusable="true" android:focusableInTouchMode="true"
-
功能二:第一次点击后光标到最后,再点击定位到具体文字
这个稍微麻烦一点,首先关闭
EditText
的焦点:android:focusable="false"
然后监听
EditText
的点击事件:etLeaveWords.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!etLeaveWords.hasFocus()) { etLeaveWords.setFocusable(true); etLeaveWords.setFocusableInTouchMode(true); etLeaveWords.requestFocus(); KeyboardUtil.softShow(mContext, etLeaveWords); String message = etLeaveWords.getText().toString(); if (!TextUtils.isEmpty(message)) { etLeaveWords.setSelection(message.length()); } } } });
注意这几部是一个整体,因为 requestFocus() 后用户需要再点击一次才可以显示键盘,这里我们直接强行显示出来:
etLeaveWords.setFocusable(true); etLeaveWords.setFocusableInTouchMode(true); etLeaveWords.requestFocus(); KeyboardUtil.softShow(mContext, etLeaveWords); // 显示键盘
至于定位,直接调用
setSelection()
方法至于软件盘消失,
EditText
失去焦点,用的网上的一个方案:etLeaveWords.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect r = new Rect(); etLeaveWords.getWindowVisibleDisplayFrame(r); int heightDiff = etLeaveWords.getRootView().getHeight() - (r.bottom - r.top); if (heightDiff < 200) { // 处理键盘隐藏 etLeaveWords.setFocusable(false); } } });