Android Nougat版本setError()提示不显示问题(低版本正常)
我之前也碰到过这个Nougat(API 24)及以上版本里EditText的setError提示异常的问题——低版本正常显示,高版本点击EditText后就出状况,折腾了好一会儿才搞定,下面分享具体的原因和解决办法:
问题原因
从Android Nougat开始,系统对EditText错误提示的显示逻辑做了调整:当EditText获取焦点后,默认的错误提示文本会自动隐藏,只保留右侧的错误图标;如果布局或主题配置有冲突,可能连图标都不显示,就会出现“点击后异常”的情况。而Marshmallow及以下版本则是始终显示完整的错误提示文本,不会因为焦点变化而隐藏。
具体解决办法
1. 监听焦点变化,强制保留错误提示(推荐)
通过焦点监听,确保EditText获取焦点时,若仍存在输入错误,就重新触发错误提示:
yourEditText.setOnFocusChangeListener((v, hasFocus) -> { if (hasFocus && TextUtils.isEmpty(yourEditText.getText().toString())) { // 当获取焦点且文本为空时,重新设置错误提示 yourEditText.setError(getString(R.string.error_enter_password)); } });
注意:记得把硬编码的提示文本改成从strings.xml资源文件取值,比如getString(R.string.error_enter_password),这样更符合Android开发规范,也方便多语言适配。
2. 指定错误图标,保留提示入口
使用setError(CharSequence error, Drawable icon)重载方法,给错误提示指定一个图标。这样即使EditText获取焦点后文本隐藏,用户点击右侧的图标依然能看到完整的错误提示:
Drawable errorIcon = getResources().getDrawable(R.drawable.ic_error_outline); yourEditText.setError(getString(R.string.error_enter_password), errorIcon);
3. 检查主题与EditText类型
确保你的App使用AppCompat主题(比如Theme.AppCompat.Light.DarkActionBar),并且EditText使用androidx.appcompat.widget.AppCompatEditText(基于AndroidX)。高版本系统对原生EditText的行为限制更多,使用AppCompatEditText能更好地兼容不同版本的显示逻辑。
额外提示
你的项目targetSdkVersion是26及以上,记得在AndroidManifest.xml中检查android:windowSoftInputMode的配置,避免adjustPan或adjustResize导致的布局偏移影响错误提示的显示。
内容的提问来源于stack exchange,提问作者Arnold Brown

