如何禁用EditText的键盘联想并让软键盘显示额外数字行
可行实现方案(不会触发厂商安全键盘)
方案1:属性组合配置(适配90%场景)
直接给EditText设置如下属性即可,无需自定义控件:
<EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textNoSuggestions|textUri" android:imeOptions="flagNoPersonalizedLearning|flagNoExtractUi" />
规则说明:
textUri属于无联想需求的输入场景,所有主流输入法都不会对该类型开启联想预测,也不会判定为密码输入场景,完全不会触发OPPO、vivo等机型的安全键盘flagNoPersonalizedLearning会明确告知输入法不要开启联想、不要记录输入内容用于个性化推荐,双重保障关闭建议栏textNoSuggestions作为兜底标志,兼容旧版输入法的规则
方案2:自定义EditText强制修改输入法配置(全机型适配)
如果部分小众输入法不遵守系统属性规则,可以重写EditText的onCreateInputConnection方法,强制修改传给输入法的配置参数,彻底关闭联想:
import android.content.Context import android.util.AttributeSet import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputConnection import androidx.appcompat.widget.AppCompatEditText class NoSuggestionEditText @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = android.R.attr.editTextStyle ) : AppCompatEditText(context, attrs, defStyleAttr) { override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection? { val connection = super.onCreateInputConnection(outAttrs) ?: return null // 清除所有会触发联想、自动更正的标志 outAttrs.inputType = outAttrs.inputType and EditorInfo.TYPE_TEXT_FLAG_AUTO_COMPLETE.inv() and EditorInfo.TYPE_TEXT_FLAG_AUTO_CORRECT.inv() and EditorInfo.TYPE_TEXT_FLAG_CAP_WORDS.inv() // 强制添加无建议标志 outAttrs.inputType = outAttrs.inputType or EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS // 关闭个性化学习 outAttrs.imeOptions = outAttrs.imeOptions or EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING return connection } }
数字行适配说明
数字行的显示逻辑由输入法本身控制,不属于系统可控范围:
- 上述两种方案关闭联想后,大部分主流输入法如果用户开启了「全键盘显示顶部数字行」的设置,都会正常展示数字行
- 如果需要全场景强制显示数字行,可以自行在EditText上方实现自定义的数字输入栏,完全不受输入法规则限制,稳定性更高
内容的提问来源于stack exchange,提问作者Encoder's YT
相关产品推荐
相关产品推荐

