Android:AutoCompleteTextView在没有输入文本时显示建议

fhu*_*cho 122 android autocompletetextview

我正在使用AutoCompleteTextView,当用户点击它时,我想显示建议,即使它没有文本 - 但setThreshold(0)工作方式完全相同setThreshold(1)- 因此用户必须输入至少1个字符才能显示建议.

Com*_*are 150

这是记录在案的行为:

threshold小于或等于0时,应用阈值1.

您可以手动显示下拉菜单showDropDown(),因此您可以安排在需要时显示.或者,子类AutoCompleteTextView和覆盖enoughToFilter(),返回true所有时间.

  • 这与OnFocusChangeListener完美结合使用,当视图获得焦点时,它调用showDropDown(). (8认同)
  • showDropDown()似乎在设置onClickListener时运行良好,但是子类的东西不能正常工作,直到用户输入一个字母并且返回dels.But不仅仅是onClick ... (7认同)
  • 当`.getText().toString().length()== 0`时@commonsWare`shownDropDown()`在`afterTextChanged`中不起作用.WHYYY (4认同)
  • 只有覆盖不够的过滤器对我有帮助。谢谢你! (2认同)

Dav*_*vra 116

这是我的班级InstantAutoComplete.这是AutoCompleteTextView和之间的事情Spinner.

import android.content.Context;  
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.AutoCompleteTextView;

public class InstantAutoComplete extends AutoCompleteTextView {

    public InstantAutoComplete(Context context) {
        super(context);
    }

    public InstantAutoComplete(Context arg0, AttributeSet arg1) {
        super(arg0, arg1);
    }

    public InstantAutoComplete(Context arg0, AttributeSet arg1, int arg2) {
        super(arg0, arg1, arg2);
    }

    @Override
    public boolean enoughToFilter() {
        return true;
    }

    @Override
    protected void onFocusChanged(boolean focused, int direction,
            Rect previouslyFocusedRect) {
        super.onFocusChanged(focused, direction, previouslyFocusedRect);
        if (focused && getAdapter() != null) {
            performFiltering(getText(), 0);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

在你的xml中使用它像这样:

<your.namespace.InstantAutoComplete ... />
Run Code Online (Sandbox Code Playgroud)

  • 那很棒!我还想指出,在你的布局XML文件中,你必须将`<AutoCompleteTextView ... />`更改为`<your.namespace.InstantAutoComplete ... />`.我失去了一些时间搞清楚:) (12认同)
  • 伟大的类 - 仅建议将在onFocusChanged方法中,将"if(focused)"更改为"if(focused && getAdapter()!= null)". (3认同)

小智 45

最简单的方法:

只需使用setOnTouchListener和showDropDown()

AutoCompleteTextView text;
.....
.....
text.setOnTouchListener(new View.OnTouchListener(){
   @Override
   public boolean onTouch(View v, MotionEvent event){
      text.showDropDown();
      return false;
   }
});
Run Code Online (Sandbox Code Playgroud)

  • 不太常见,但是如果用户没有触摸以便转到此EditText,这将不起作用.例如,使用带按钮的遥控器(例如Android TV). (6认同)
  • 您应该使用setOnFocusChanged。有人可以拥有键盘并按TAB按钮,或者使用鼠标和触摸监听器将不会被调用。 (2认同)

ale*_*lex 16

当只有一个InstantAutoComplete对象时,Destil的代码效果很好.虽然它不适用于两个 - 不知道为什么.但是当我把showDropDown()(就像CommonsWare建议的那样)放到onFocusChanged()这样的时候:

@Override
protected void onFocusChanged(boolean focused, int direction,
        Rect previouslyFocusedRect) {
    super.onFocusChanged(focused, direction, previouslyFocusedRect);
    if (focused) {
        performFiltering(getText(), 0);
        showDropDown();
    }
}
Run Code Online (Sandbox Code Playgroud)

它解决了这个问题.

只是两个答案正确结合,但我希望它可以节省一些时间.

  • 您的添加有所帮助,但如果 InstantAutoComplete 中有文本并且屏幕方向发生变化,我会收到错误消息。我通过检查窗口可见性来修复它,我在这里发布了新代码:https://gist.github.com/furycomptuers/4961368 (2认同)

dav*_*lee 8

适配器最初不执行过滤.
未执行过滤时,下拉列表为空.
所以你可能必须先进行过滤.

为此,您可以filter()在添加完条目后调用:

adapter.add("a1");
adapter.add("a2");
adapter.add("a3");
adapter.getFilter().filter(null);
Run Code Online (Sandbox Code Playgroud)


小智 6

Destil上面的答案几乎可行,但有一个微妙的错误.当用户首先将焦点放在字段上时它会起作用,但是如果它们离开然后返回到字段,它将不会显示下拉列表,因为mPopupCanBeUpdated的值在隐藏时仍然为false.修复方法是将onFocusChanged方法更改为:

@Override
protected void onFocusChanged(boolean focused, int direction,
        Rect previouslyFocusedRect) {
    super.onFocusChanged(focused, direction, previouslyFocusedRect);
    if (focused) {
        if (getText().toString().length() == 0) {
            // We want to trigger the drop down, replace the text.
            setText("");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Dal*_*ngh 6

只需在 autoCompleteTextView 的触摸或单击事件或您想要的位置调用此方法即可。

autoCompleteTextView.showDropDown()
Run Code Online (Sandbox Code Playgroud)


Gök*_*ren 5

你可以使用onFocusChangeListener;

TCKimlikNo.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {
                TCKimlikNo.showDropDown();

            }

        }
    });
Run Code Online (Sandbox Code Playgroud)