AutoCompleteTextView使用completionHintView替换ID致崩溃问题咨询
问题原因与解决方案
这问题我之前排查过,其实是AutoCompleteTextView的内部实现逻辑在“搞事情”,跟你代码里有没有手动setText完全没关系!
核心原因
AutoCompleteTextView在加载android:completionHintView指定的自定义布局时,内部会自动尝试查找ID为@android:id/text1的TextView控件,用来填充提示文本(哪怕你没在代码里主动设置)。如果你的自定义布局里没有这个ID的控件,系统找不到目标View就会抛出NullPointerException,进而引发InflateException崩溃。
这是系统控件的内置约定,不是bug,只是官方文档没把这个细节说清楚而已。
两种解决方案
方案一:直接复用系统指定ID(推荐)
把你自定义布局customer_autocomplete_hint里的TextView ID改成@android:id/text1,不用改任何代码逻辑,系统就能自动绑定并正常显示提示内容,完美解决崩溃问题。方案二:重写AutoCompleteTextView自定义逻辑
如果因为业务原因不能修改TextView的ID,可以继承AutoCompleteTextView,重写它创建提示视图的方法,手动指定要用来显示提示的控件。举个简单的例子:public class CustomAutoCompleteTextView extends AutoCompleteTextView { public CustomAutoCompleteTextView(Context context) { super(context); } public CustomAutoCompleteTextView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected View createCompletionHintView() { // 加载你的自定义布局 View hintView = LayoutInflater.from(getContext()).inflate(R.layout.customer_autocomplete_hint, null); // 找到你自定义ID的TextView,手动设置提示文本 TextView hintText = hintView.findViewById(R.id.your_custom_text_id); hintText.setText(getCompletionHint()); return hintView; } }之后在布局里使用你自定义的
CustomAutoCompleteTextView即可。
内容的提问来源于stack exchange,提问作者LorenzoBerti
相关产品推荐
相关产品推荐

