Android EditText获取焦点后只显示光标不弹出软键盘

本文介绍如何在Android中控制EditText获得焦点时的行为,包括只显示光标而不弹出软键盘的方法。适用于不同版本的Android系统,并提供代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android EditText获取焦点后只显示光标不弹出软键盘

参考博客链接

直接说结论

如果你项目适配的最小版本大于等于21
//直接调用EditText的该方法,设置为false即可
binding.newPesticideEditCodeEt.setShowSoftInputOnFocus(false);
如果你项目适配的最小版本小于21
    public void disableShowInput(EditText et) {
        Class<EditText> cls = EditText.class;
        Method method;
        try {
            method = cls.getMethod("setShowSoftInputOnFocus", boolean.class);
            method.setAccessible(true);
            method.invoke(et, false);
        } catch (Exception e) {//TODO: handle exception
        }
   }

参考博客中的代码分析

    public void disableShowInput(EditText et) {
        Class<EditText> cls = EditText.class;
        Method method;
        try {
            //setShowSoftInputOnFocus方法是EditText从TextView继承来的的
            //可以用来设置当EditText获得焦点时软键盘是否可见
            method = cls.getMethod("setShowSoftInputOnFocus", boolean.class);
            method.setAccessible(true);
            method.invoke(et, false);
        } catch (Exception e) {//TODO: handle exception
        }
        try {
            //这里是没用的,直接删掉即可,因为EditText类,TextView类,View类中,
            // 都没有setSoftInputShownOnFocus这个方法,不可能获得method对象的
            method = cls.getMethod("setSoftInputShownOnFocus", boolean.class);
            method.setAccessible(true);
            method.invoke(et, false);
        } catch (Exception e) {//TODO: handle exception
        }
    }

设置启动某个Activity时,不弹出软键盘

  • Manifests 文件中对该Activity设置如下
    • android:windowSoftInputMode="stateAlwaysHidden"
### 解决方案 在开发过程中,当需要处理输入框聚焦时希望软键盘弹出的情况时,可以采用多种方式实现这一需求。以下是几种常见的解决方案: #### 方法一:通过 `focus` 和定时器隐藏软键盘 可以通过监听输入框的 `focus` 事件,在该事件触发后立即调用方法隐藏软键盘。这种方法适用于 UniApp 或其他前端框架。 ```javascript // 使用 Vue 的生命周期钩子或组件初始化逻辑绑定 focus 事件 onFocus() { setTimeout(() => { uni.hideKeyboard(); // 隐藏软键盘 }, 0); } ``` 此方法利用了 `setTimeout` 来延迟执行软键盘关闭操作,从而避免软键盘短暂显示的问题[^1]。 --- #### 方法二:设置 Android 原生属性禁用软键盘 对于原生 Android 开发场景下,可以在布局文件中为 `EditText` 设置特定属性以防止其自动获取焦点弹出软键盘。 ```xml <EditText android:focusable="false" android:focusableInTouchMode="false" android:windowSoftInputMode="stateHidden"/> ``` 上述 XML 属性配置能够有效阻止软键盘默认弹出行为[^2]。 另外一种更灵活的方式是在 Activity 中调整窗口参数: ```java getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); ``` 这种方式同样能起到抑制软键盘的作用,并且会影响用户体验。 --- #### 方法三:动态控制 InputType 类型 还可以尝试修改 `EditText` 的 `inputType` 属性为空字符串或者不可见字符集形式,这样即使控件获得了焦点会激活任何类型的虚拟键盘。 ```java editText.setInputType(InputType.TYPE_NULL); ``` 这种技术手段特别适合那些仅需展示光标而无需实际录入数据的应用场合。 --- #### 方法四:拦截触摸事件 最后还有一种较为激进但也非常有效的策略就是重写 View 的 onTouchEvent 函数来手动管理交互流程: ```java @Override public boolean onTouchEvent(MotionEvent event){ if(event.getAction()==MotionEvent.ACTION_DOWN){ this.clearFocus(); } return super.onTouchEvent(event); } ``` 这样做之后即便点击到了编辑区域上边沿部分也再会有新的焦点分配给它进而引发必要的界面变化现象发生. --- ### 总结 综上所述,针对同平台和技术栈可以选择合适的方式来达成目标效果。如果是基于 H5/UniAPP 则推荐使用 JavaScript 结合 API 实现;而对于 Native App (尤其是安卓端),则更多依赖于自定义视图以及系统级设定完成相应功能定制化需求满足过程中的挑战克服工作。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值