如何彻底禁用AutoCompleteTextView触发的系统软键盘
彻底禁用AutoCompleteTextView的系统软键盘方案
我之前做类似项目时也碰到过这个问题,临时隐藏软键盘确实治标不治本,试试下面这几个方法,应该能彻底解决你的需求:
方法一:XML布局直接配置(API 21+)
最简单的方式就是给AutoCompleteTextView添加android:showSoftInputOnFocus="false"属性,这个属性会告诉系统:当控件获取焦点时,不要弹出软键盘。同时别忘了保持控件的可聚焦性,确保你的自定义键盘能正常触发:
<AutoCompleteTextView android:id="@+id/autoComplete_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:showSoftInputOnFocus="false" android:focusable="true" android:focusableInTouchMode="true"/>
这个方法代码最少,适合Android 5.0及以上的设备。
方法二:代码监听焦点/触摸事件(兼容低版本)
如果需要兼容API 21以下的设备,我们可以通过监听控件的触摸事件或者焦点变化事件,主动拦截系统弹出软键盘的行为:
方式A:触摸事件拦截
在Activity的onCreate方法里给AutoCompleteTextView设置触摸监听,直接请求焦点并拦截事件,不让系统触发软键盘:
AutoCompleteTextView autoCompleteTV = findViewById(R.id.autoComplete_tv); autoCompleteTV.setOnTouchListener((v, event) -> { // 请求焦点 v.requestFocus(); // 在这里调用你的自定义键盘显示逻辑 showCustomKeyboard(); // 返回true表示拦截事件,不让系统继续处理 return true; });
方式B:焦点变化监听
如果控件可能通过非触摸方式获取焦点(比如代码调用requestFocus()),可以加上焦点变化监听,一旦获取焦点就立刻隐藏软键盘:
autoCompleteTV.setOnFocusChangeListener((v, hasFocus) -> { if (hasFocus) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); // 强制隐藏软键盘 imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY); // 显示自定义键盘 showCustomKeyboard(); } else { // 失去焦点时可以隐藏自定义键盘 hideCustomKeyboard(); } });
方法三:自定义AutoCompleteTextView(最彻底的方案)
如果上面的方法还是有漏网之鱼,我们可以直接重写AutoCompleteTextView的onCheckIsTextEditor()方法,返回false——这个方法是告诉系统“这个控件不是文本编辑器”,系统自然就不会弹出软键盘了:
首先创建自定义控件类:
public class NoSoftInputAutoCompleteTextView extends AutoCompleteTextView { public NoSoftInputAutoCompleteTextView(Context context) { super(context); } public NoSoftInputAutoCompleteTextView(Context context, AttributeSet attrs) { super(context, attrs); } public NoSoftInputAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public boolean onCheckIsTextEditor() { // 返回false,让系统认为这不是文本输入控件 return false; } }
然后在布局文件中使用这个自定义控件:
<com.your.package.name.NoSoftInputAutoCompleteTextView android:id="@+id/autoComplete_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:focusable="true" android:focusableInTouchMode="true"/>
这个方案兼容性最好,不管什么版本都能彻底禁用系统软键盘,而且一劳永逸,不用每次都写监听逻辑。
内容的提问来源于stack exchange,提问作者Hothyfa al-khateeb
相关产品推荐
相关产品推荐

