触摸EditText时显示光标但不弹出软键盘的问题求助
解决EditText设置InputType.TYPE_NULL后无法显示光标问题
我来帮你搞定这个问题~你遇到的情况其实是因为InputType.TYPE_NULL会让系统默认认为这个EditText不需要编辑状态,所以光标会被强制隐藏,再加上三星Galaxy S6的ROM对这个逻辑有更严格的自定义处理,导致你调用setCursorVisible(true)也没生效。下面给你几个可行的解决方案:
方案一:替换TYPE_NULL为更温和的软键盘禁用方式
从API 21(Android 5.0)开始,系统提供了setShowSoftInputOnFocus(false)方法,专门用来设置获取焦点时不弹出软键盘,同时不会影响光标显示。低版本可以用触摸事件手动隐藏软键盘:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final EditText edit = findViewById(R.id.edit); // 高版本直接禁用软键盘弹出 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { edit.setShowSoftInputOnFocus(false); } else { // 低版本兼容:触摸时获取焦点并隐藏软键盘 edit.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { v.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); return true; } }); } // 触摸时确保光标可见 edit.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { edit.setCursorVisible(true); return false; } }); }
方案二:保留TYPE_NULL,强制触发光标显示
如果你一定要用InputType.TYPE_NULL,可以在触摸事件里手动请求焦点、设置光标可见,同时用setSelection强制定位光标位置,并且拦截触摸事件(返回true)避免系统覆盖你的设置:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final EditText edit = findViewById(R.id.edit); edit.setInputType(InputType.TYPE_NULL); edit.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // 先请求焦点 edit.requestFocus(); // 强制显示光标 edit.setCursorVisible(true); // 设置光标到文本末尾,确保光标能被看到 edit.setSelection(edit.getText().length()); // 隐藏软键盘(保险起见) InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); // 返回true拦截事件,避免系统后续处理隐藏光标 return true; } }); }
为什么你的原代码不生效?
setInputType(InputType.TYPE_NULL)会将EditText的光标可见性默认置为false,系统优先级很高,单纯调用setCursorVisible(true)可能被覆盖;- 你的触摸事件返回
false,意味着事件会继续传递给系统的默认处理逻辑,系统可能在后续流程中再次隐藏光标; - 三星的定制ROM对InputType的处理更严格,放大了这个问题。
内容的提问来源于stack exchange,提问作者Suthakar
相关产品推荐
相关产品推荐

