如何禁用AutoCompleteTextView的下拉显示?

wwy*_*wyt 16 android

我使用以下代码将文本设置为AutoCompleteTextView字段.但我注意到,当我将某些文本(不是所有文本,而是一些文本)设置为它时,它会自动弹出下拉列表.如果我不要求焦点,那会更好,但更好,不完全正确.我试过dissmissDropDwon(),它没有帮助.那么,有没有办法在设置文本并关注它后停止显示下拉?

actv.setText("Tim Hortons");
actv.setSelection(0, actv.getText().length());
actv.requestFocus();
actv.dismissDropDown();    // doesn't help
Run Code Online (Sandbox Code Playgroud)

谢谢!

Ita*_*ana 20

另一种解决方案是在设置文本之前清除焦点:

mContactTxt.setFocusable(false);
mContactTxt.setFocusableInTouchMode(false);
mContactTxt.setText("");            
mContactTxt.setFocusable(true);
mContactTxt.setFocusableInTouchMode(true);
Run Code Online (Sandbox Code Playgroud)


小智 16

您可以尝试以下步骤:

  1. 设置文本时,还要将"阈值"值设置为较大的值,以便下拉列表不会出现.

     actv.setThreshold(1000);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后覆盖OnTouch以将阈值设置回1.

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


wwy*_*wyt 13

如果有人遇到同样的问题,请回答我自己的问题:

AutoCompleteTextView的一个特征是,如果以编程方式更改其文本,如果满足以下两个条件,它将下拉选择列表:1.它具有焦点; 这份清单超过30件物品.

实际上,这种行为,恕我直言,一个设计缺陷.当程序将文本设置为AutoCompleteTextView时,这意味着文本已经正确,没有必要弹出过滤后的列表供用户进一步选择.

actv.setText("Tim Hortons"); 
actv.setSelection(0, actv.getText().length()); 
actv.requestFocus(); 
actv.dismissDropDown();    // doesn't help 
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,requestFocus()强制ACTV获得焦点,这会导致下拉列表弹出.我试着不要求焦点,相反,我在设置文本后调用了clearFocus().但这种行为非常......非常自然.dissmissDropdown()没有帮助因为....我不知道,它只是没有帮助.所以,经过多次努力,我想出了这个解决方法:

  1. 初始化窗口小部件时,我记得类字段中的适配器.
  2. 将上面的代码更改为:

    mAdapter = (ArrayAdapter<String>)actv.getAdapter(); // mAdapter is a class field        
    actv.setText("Tim Hortons"); 
    actv.setSelection(0, actv.getText().length()); 
    actv.setAdapter((ArrayAdapter<String>)null); // turn off the adapter
    actv.requestFocus();
    Handler handler = new Handler() {
    public void handleMessage(Message msg) {
        ((AutoCompleteTextView)msg.obj).setAdapter(mAdapter);
        };
    Message msg = mHandler.obtainMessage();
    msg.obj = actv;
    handler.sendMessageDelayed(msg, 200);   // turn it back on after 200ms
    
    Run Code Online (Sandbox Code Playgroud)

这里的技巧是将ACTV的适配器设置为null.因为没有适配器,系统当然不会弹出下拉列表.但该消息将在200ms的编程延迟后将适配器重置回ACTV,并且ACTV将照常正常工作.

这适合我!


eer*_*ock 11

您还可以启用/禁用下拉菜单,如下所示:

// disable
actv.setDropDownHeight(0);
// enable
actv.setDropDownHeight(LayoutParams.WRAP_CONTENT);
Run Code Online (Sandbox Code Playgroud)


小智 6

setText("someText",false)
Run Code Online (Sandbox Code Playgroud)

false 表示它没有过滤


Ole*_*ndr 5

也许到了很晚,但是我已经找到了解决该问题的好方法:

设置文本之前禁用过滤,然后再启用文本(而不是集中播放或延迟播放)。在这种情况下,您应该使用自定义控件。

请参见下面的示例:

public class CustomCompliteTextView extends AutoCompleteTextView {

    private boolean mIsSearchEnabled = true;

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

    public CustomCompliteTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomCompliteTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void setSearchEnabled(boolean isEnabled) {
        mIsSearchEnabled = isEnabled;
    }

    @Override
    protected void performFiltering(CharSequence text, int keyCode) {
        if (mIsSearchEnabled) {
            super.performFiltering(text, keyCode);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

和用法:

    text.setSearchEnabled(false);
    text.setText("Text you want to set");
    // optional, if you also want to set correct selection
    text.setSelection(text.getText().length());
    text.setSearchEnabled(true);
Run Code Online (Sandbox Code Playgroud)