如何检测AutoCompleteTextView当前是否正在展示下拉建议列表
检测AutoCompleteTextView下拉建议列表展示状态的实现方法
可以直接通过Android原生提供的API完成检测,具体实现方式如下:
1. 主动查询状态(最简单方案)
AutoCompleteTextView自带isPopupShowing()方法,直接返回布尔值,true代表下拉建议列表正在展示,false代表已收起,可在任意需要的时机调用,比如用户输入过程中检测:
autoCompleteTextView.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (autoCompleteTextView.isPopupShowing()) { // 下拉列表处于展示状态的对应逻辑 } else { // 下拉列表处于收起状态的对应逻辑 } } @Override public void afterTextChanged(Editable s) {} });
2. 被动监听状态变化(扩展方案)
如果需要实时感知下拉的展开/收起事件,不需要主动轮询查询,可以重写AutoCompleteTextView的相关方法,自定义状态回调:
自定义带状态监听的AutoCompleteTextView
public class StatefulAutoCompleteTextView extends AppCompatAutoCompleteTextView { private OnPopupStateChangeListener stateListener; // 自定义状态回调接口 public interface OnPopupStateChangeListener { void onPopupShown(); // 下拉展开时回调 void onPopupDismissed(); // 下拉收起时回调 } public void setOnPopupStateChangeListener(OnPopupStateChangeListener listener) { this.stateListener = listener; } // 三个构造方法按常规自定义控件写法补全即可 public StatefulAutoCompleteTextView(@NonNull Context context) { super(context); } public StatefulAutoCompleteTextView(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public StatefulAutoCompleteTextView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public void onFilterComplete(int count) { super.onFilterComplete(count); // 过滤完成后如果有匹配结果、下拉正常展示则触发展开回调 if (count > 0 && isPopupShowing() && stateListener != null) { stateListener.onPopupShown(); } } @Override public void dismissDropDown() { super.dismissDropDown(); if (stateListener != null) { stateListener.onPopupDismissed(); } } }
使用示例
StatefulAutoCompleteTextView autoCompleteTv = findViewById(R.id.auto_complete_tv); autoCompleteTv.setOnPopupStateChangeListener(new StatefulAutoCompleteTextView.OnPopupStateChangeListener() { @Override public void onPopupShown() { // 下拉展开时的处理逻辑 } @Override public void onPopupDismissed() { // 下拉收起时的处理逻辑 } });
注意事项
isPopupShowing()是API level 3就已经提供的原生接口,所有主流Android版本都支持,无需额外适配- 如果你给控件设置了
threshold属性,只有输入字符数达到阈值后才会触发下拉展示,此时调用isPopupShowing()才会返回true - 点击下拉外区域、点击返回键收起下拉、选中下拉项后收起的场景,都会触发
dismissDropDown(),自定义监听可以正常捕获所有收起事件
内容的提问来源于stack exchange,提问作者shafri
相关产品推荐
相关产品推荐

