Android中点击设为可聚焦的TextView后如何隐藏软键盘?
解决TextView设置可聚焦后点击弹出软键盘的问题
嘿,我来帮你搞定这个头疼的问题!咱们先理清楚根源:当你把TextView设为focusable或focusableInTouchMode后,点击它时系统会默认认为你要编辑内容,所以自动弹出软键盘。之前你在点击事件里处理之所以无效,是因为软键盘已经被系统唤起了,这时候再去隐藏就有点滞后了。下面给你几个靠谱的解决方案:
方案一:从布局根源阻止软键盘弹出
最简单的办法就是在XML里给TextView加两个属性,直接告诉系统这货不需要输入:
<TextView android:id="@+id/end_time_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:focusable="true" android:focusableInTouchMode="true" android:inputType="none" <!-- 关键:禁用输入类型,系统就不会弹键盘了 --> android:cursorVisible="false" /> <!-- 可选:隐藏光标,避免看起来像可编辑框 -->
方案二:在焦点变化时立即隐藏软键盘
如果XML设置不够,咱们就在焦点刚获取的瞬间动手,这时候软键盘还没弹出来呢:
mEndTimeView.setOnFocusChangeListener((v, hasFocus) -> { if (hasFocus) { // 获取焦点时马上把软键盘按下去 InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); // 用HIDE_IMPLICIT_ONLY参数,只隐藏系统自动唤起的键盘 imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY); // 接着弹出你的时间选择器 showEndTimePicker(); // 可选:如果不需要TextView保持焦点,直接清掉 v.clearFocus(); } });
方案三:拦截触摸事件,提前阻止默认行为
还有一种思路是在触摸事件里先处理软键盘,再执行你的逻辑,同时拦截掉默认的焦点行为:
mEndTimeView.setOnTouchListener((v, event) -> { if (event.getAction() == MotionEvent.ACTION_UP) { InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); showEndTimePicker(); // 返回true表示我们自己处理了触摸事件,不让系统走默认逻辑 return true; } return false; });
补充说明
之前你用setOnClickListener无效的原因是:点击事件触发时,TextView已经拿到焦点,系统已经开始唤起软键盘了,这时候再调用hide方法要么赶不上,要么系统会重新触发唤起。所以一定要在焦点变化的瞬间或者触摸事件的早期处理。另外,不用纠结键盘是否显示,直接调用hide方法就行——如果键盘没弹出来,调用它也不会有任何问题,省得判断出错。
内容的提问来源于stack exchange,提问作者Manish Goyal
相关产品推荐
相关产品推荐

