You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

触摸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;
        }
    });
}

为什么你的原代码不生效?

  1. setInputType(InputType.TYPE_NULL)会将EditText的光标可见性默认置为false,系统优先级很高,单纯调用setCursorVisible(true)可能被覆盖;
  2. 你的触摸事件返回false,意味着事件会继续传递给系统的默认处理逻辑,系统可能在后续流程中再次隐藏光标;
  3. 三星的定制ROM对InputType的处理更严格,放大了这个问题。

内容的提问来源于stack exchange,提问作者Suthakar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:41:22