如何禁用AutoCompleteTextView的下拉显示?

时间:2011-03-31 04:04:46

标签: android

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

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

谢谢!

18 个答案:

答案 0 :(得分:20)

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

mContactTxt.setFocusable(false);
mContactTxt.setFocusableInTouchMode(false);
mContactTxt.setText("");            
mContactTxt.setFocusable(true);
mContactTxt.setFocusableInTouchMode(true);

答案 1 :(得分:16)

您可以尝试以下步骤:

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

     actv.setThreshold(1000);
    
  2. 然后覆盖OnTouch以将阈值设置回1。

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

答案 2 :(得分:12)

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

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

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

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

在上面的代码中,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
    
  3. 这里的技巧是将ACTV的适配器设置为null。因为没有适配器,系统当然不会弹出下拉列表。但该消息将在200ms的编程延迟后将适配器重置回ACTV,并且ACTV将照常正常工作。

    这对我有用!

答案 3 :(得分:10)

你也可以这样启用/禁用下拉列表:

// disable
actv.setDropDownHeight(0);
// enable
actv.setDropDownHeight(LayoutParams.WRAP_CONTENT);

答案 4 :(得分:5)

也许是为时已晚,但我已找到解决此问题的优雅解决方案:

在设置文本并在之后启用之前禁用过滤(而不是使用焦点或/和延迟)。在这种情况下,您应该使用自定义控件。

见下面的例子:

break

用法:

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);
        }
    }
}

答案 5 :(得分:4)

setText("someText",false)

false表示它没有过滤

答案 6 :(得分:3)

有趣的伎俩。 100%工作:)

tv.setThreshold(Integer.MAX_VALUE);
tv.setText(station.getName());
tv.setThreshold(1);

答案 7 :(得分:3)

act.post(new Runnable() 
{
  @Override
  public void run()
  {
    act.dismissDropDown();
  }
});

工作得很好!

答案 8 :(得分:2)

wwyt,我只是通过移除适配器来重复使用你的技巧,这些是解除下拉/关闭下拉列表的基本要素。

AutoCompleteTextView tvSuburbs;
ArrayAdapter<Suburb> a = (ArrayAdapter<Suburb>) tvSuburbs.getAdapter();
tvSuburbs.setAdapter(null); // Remove the adapter so we don't get a dropdown
tvSuburbs.setText(s.name); // when text is set programmatically.
tvSuburbs.setAdapter(a); // Restore adapter

答案 9 :(得分:1)

以XML格式试用...

<TextView  
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:autoText="false"
/>

答案 10 :(得分:1)

你可以尝试

searchInput.setAdapter((ArrayAdapter<String>) null);
searchInput.setText(text);
searchInput.setAdapter(adapter);

Source

答案 11 :(得分:1)

我也面对一个场景,我以这种方式解决了。

  1. 以静态方式存储您要显示的值(Ex.POJO)。
  2. 检查存储的静态变量是否为空且不为空。
  3. 如果,它不为空/非null /其长度大于0,则为该autocompleteTextView设置dismissDropDown()
  4. 请找到以下代码段

    if(null != testText && testText.length() != 0) {
        mAutoCompleteSearch.setText(incomingActivity.toString());
        mAutoCompleteSearch.dismissDropDown(); //Dismiss the drop down
        } else {
        mAutoCompleteSearchDocketActivity.setText("");
                // Here it(drop down) will be shown automatically
        }
    

    希望,这会对某人有所帮助,干杯!

答案 12 :(得分:0)

我用这段代码解决了同样的问题:

contacts_search.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // TODO Auto-generated method stub
                contacts_search.dismissDropDown();      
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
                // TODO Auto-generated method stub
                contacts_search.dismissDropDown();
            }

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub
                contacts_search.dismissDropDown();
            }
        });

此处,contacts_search是我的AutoCompleteTextView

答案 13 :(得分:0)

dismissDropDown()在适配器中运行良好:

        SimpleCursorAdapter autoCompleteAdapter = new SimpleCursorAdapter(this,
                    android.R.layout.select_dialog_item, null,
                    new String[] { ContactsContract.Contacts.DISPLAY_NAME },
                    new int[] { android.R.id.text1 }, 0);
        mSearchView.setAdapter(autoCompleteAdapter); 
        autoCompleteAdapter.setFilterQueryProvider(new FilterQueryProvider() {
            @Override
            public Cursor runQuery(CharSequence constraint) {
               mSearchView.dismissDropDown();
               // return your query code
            }
        });

希望它会有所帮助。

答案 14 :(得分:0)

我需要添加一些延迟来使这件事工作。

这对我有用:

new Handler().postDelayed(new Runnable() {
    public void run() {
        if(carModel.isPopupShowing())
            carModel.dismissDropDown();
}}, 500);

答案 15 :(得分:0)

这里的目的是使用AutoCompleteTextView隐藏下拉列表。在布局文件中将dropDownHeight设置为零。

<!--Skipping all other attributes for simplicity-->
<AutoCompleteTextView
        android:id="@+id/address_bar"
        android:dropDownHeight="0dp"
        />

就我而言,我有GridView,并且该视图上方有地址栏。我想根据AutoCompleteTextView中的用户输入过滤GridView中的项目,而不需要TextView向我显示下拉列表。

答案 16 :(得分:0)

AppCompatAutoCompleteTextView中不能setTreshold()。如果使用AppCompatAutoCompleteTextView类,可以尝试以下方法:

actv.setText("Tim Hortons");
actv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            actv.setText("");
        }
    });

答案 17 :(得分:0)

我想你正在使用这种结构

<TextInputLayout>
    <AutoCompleteTextView/>
</TextInputLayout>

要禁用下拉菜单,您只需要在 isEnabled 中将 TextInputLayout 字段设置为 false