设置inputType为null时如何让EditText光标可见且隐藏系统键盘?
解决方案:保持EditText光标可见且系统键盘隐藏(适配Oreo及以上)
我之前做计算器应用时也碰到过一模一样的问题——设置InputType.TYPE_NULL能隐藏键盘,但光标看不见;用setRawInputType在低版本有效,到Oreo就失效弹出键盘。下面给你两个亲测有效的方案:
方案一:通过触摸监听+强制隐藏键盘实现
这种方法不需要自定义控件,直接在原有EditText基础上处理:
- 首先在XML布局里确保光标相关属性开启:
<EditText android:id="@+id/editText" style="@style/editTextStyle" android:text="0" android:cursorVisible="true" android:textIsSelectable="true" />
- 然后在Java代码里设置输入类型并拦截键盘弹出:
editText = findViewById(R.id.editText); // 设置为文本类型保证光标可见 editText.setInputType(InputType.TYPE_CLASS_TEXT); editText.setTextIsSelectable(true); // 初始化时强制隐藏键盘 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); } // 监听触摸事件,确保点击EditText时不弹出键盘,同时保留光标操作 editText.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // 让光标默认定位到文本末尾(可选,根据你的需求调整) editText.setSelection(editText.getText().length()); // 再次隐藏键盘,防止Oreo版本弹出 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } // 返回false,让EditText处理触摸事件,这样光标可以正常移动、选中 return false; } });
方案二:自定义EditText(更稳定,适配所有版本)
这种方法从根源上阻止系统创建输入连接,彻底避免键盘弹出,同时保证光标可见,是我最终采用的方案:
- 创建自定义EditText类:
public class NoKeyboardEditText extends androidx.appcompat.widget.AppCompatEditText { public NoKeyboardEditText(Context context) { super(context); initView(); } public NoKeyboardEditText(Context context, AttributeSet attrs) { super(context, attrs); initView(); } public NoKeyboardEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); } private void initView() { // 设置文本类型保证光标可见 setInputType(InputType.TYPE_CLASS_TEXT); // 允许文本选中,方便光标操作 setTextIsSelectable(true); // 强制显示光标 setCursorVisible(true); } @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { // 返回null,阻止系统创建输入连接,从而不会弹出键盘 return null; } }
- 在XML布局里使用这个自定义控件:
<com.yourpackage.NoKeyboardEditText android:id="@+id/editText" style="@style/editTextStyle" android:text="0" android:textIsSelectable="true" />
这个方案的优势在于,不需要额外处理触摸事件或键盘隐藏逻辑,各个Android版本(包括Oreo及以上)都能稳定工作,完美满足计算器应用的需求。
内容的提问来源于stack exchange,提问作者Amar Pawar
相关产品推荐
相关产品推荐

