当程序自动设置文本时,我该如何避免自动完成下拉列表的出现?

20

我在布局中有一个AutoCompleteTextView。我还有一种选择与AutoCompleteTextView中相同项的另一种方式。当选择这种替代方法时,我通过以下方式填充AutoCompleteTextView中的值:

autoCompleteTextView.setText(valueFromAlternativeSource);

其中valueFromAlternativeSource是有效的自动完成选项之一。问题在于,当调用setText时,自动完成下拉列表会出现。将以下行放在上述行之后不起作用:

autoCompleteTextView.dismissDropDown();  //Doesn't work.  Why?

有什么想法,为什么无法使用下拉菜单或其他方法可以关闭下拉菜单?

1
你的解决方案不起作用,因为setText(CharSequence)方法会启动异步工作。每当文本更改时,Adapter的过滤器都会用于过滤可能显示的建议。由于过滤器可能需要很长时间,因此它是异步调用的。一段时间后,过滤器返回并在UI线程再次获得处理时间时显示其结果。此时,dismissDropDown()方法早已完成-这就是为什么该方法根本没有任何效果的原因。 - Singed
5个回答

16

这对我来说很好用,而且更简单:

ListAdapter adapter = autoCompleteTextView.getAdapter();
autoCompleteTextView.setAdapter(null);
autoCompleteTextView.setText("whatever");
autoCompleteTextView.setAdapter(adapter);

很好,但在设置适配器之前,我必须再次分配适配器,并且对于显示/隐藏工作正常。 - Noor Hossain

12

如果您想支持API<17,子类化AutoCompleteTextview并重写setText(text, filter)方法。

@Override
public void setText(CharSequence text, boolean filter) {
    if(Build.VERSION.SDK_INT>=17) {
        super.setText(text, filter);
    }else{
        if(filter){
            setText(text);
        }else{
            ListAdapter adapter = getAdapter();
            setAdapter(null);
            setText(text);
            if(adapter instanceof ArrayAdapter)
                setAdapter((ArrayAdapter) adapter);
            else
                setAdapter((CursorAdapter) adapter);
            //if you use more types of Adapter you can list them here
        }
    }
}

那么每当您想手动设置文本时,请调用 setText(text, false)


最佳答案仅适用于API<17支持! - Petro

7

看起来这是消息处理顺序的问题。 我的解决方法如下:

//autoCompleteTextView.dismissDropDown();
new Handler().post(new Runnable() {
    public void run() {
        autoCompleteTextView.dismissDropDown();
}});

3
autoCompleteTextView.setText(valueFromOtherMeans, filter);

     * @param filter If <code>false</code>, no filtering will be performed
     *        as a result of this call.

如果您在回答中添加一些散文,那将会很好。 - faceman

2

我的解决方案(但我不太喜欢它,应该有更好的方法):

autoCompleteTextView.setText(valueFromAlternativeSource);
autoCompleteTextView.setDropDownHeight(0);

autoCompleteTextView.setOnKeyListener(new OnKeyListener(){

   @Override
   public boolean onKey(View v, int keyCode, KeyEvent event) {
       autoCompleteTextView.setDropDownHeight(LayoutParams.WRAP_CONTENT);
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接