Как отключить раскрывающийся список AutoCompleteTextView?

Я использую следующий код для установки текста в поле AutoCompleteTextView. Но я заметил, что когда я устанавливаю определенный текст (не весь текст, но некоторые), он автоматически всплывает в раскрывающемся списке. Если я не буду запрашивать фокус, было бы лучше, но только лучше, не совсем все в порядке. Я пробовал dissmissDropDwon(), это не помогает. Итак, есть ли способ остановить раскрывающееся меню после установки текста и сосредоточиться на нем?

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

Спасибо!

Ответ 1

Чтобы ответить на мой собственный вопрос, если у кого-то была такая же проблема:

Одной из характеристик AutoCompleteTextView является то, что если вы программным образом измените свой текст, она выпадает из списка выбора, если выполняются следующие два условия: 1. Он имеет фокус; 2. Список длиннее 30 предметов.

Это поведение на самом деле, ИМХО, дефект дизайна. Когда программа устанавливает текст в AutoCompleteTextView, это будет означать, что текст уже правильный, нет смысла всплывать отфильтрованный список для дальнейшего выбора пользователем.

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

В приведенном выше коде requestFocus() заставляет ACTV получать фокус, и это вызывает всплывающее раскрывающееся меню. Я попытался не обращать внимания, вместо этого я вызвал clearFocus() после установки текста. Но поведение очень... неестественно. dissmissDropdown() не помогает, потому что.... Я не знаю, это просто не помогает. Итак, после многого боя, я придумал эту работу:

  • При инициализации виджета я вспомнил адаптер в поле класса.
  • Измените приведенный выше код на:

    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
    

Здесь трюк устанавливает для адаптера ACTV значение null. Поскольку нет адаптера, конечно, система не выведет раскрывающийся список. Но сообщение вернет адаптер reset обратно в ACTV после запрограммированной задержки 200 мс, и ACTV будет работать нормально, как обычно.

Это работает для меня!

Ответ 2

Вы можете выполнить следующие действия:

  • При настройке текста также установите значение Threshold на большое значение, чтобы выпадающее меню не появилось.

     actv.setThreshold(1000);
    
  • Затем переопределите OnTouch, чтобы установить порог в 1.

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

Ответ 3

Другим решением является очистка фокуса перед установкой текста:

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

Ответ 4

Вы также можете включить/отключить выпадающее меню так:

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

Ответ 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);
        }
    }
}

И использование:

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

Ответ 6

Забавный трюк. Работает 100%:)

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

Ответ 7

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

Хорошо работает!

Ответ 8

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

Попробуйте в XML...

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

Ответ 10

Я тоже столкнулся со сценарием, и я решил таким образом.

  • Сохранять значения, которые вы хотите показать, статическим способом (Ex.POJO).
  • Проверьте, не является ли хранимая статическая переменная не пустой, а не пустой.
  • если, его не пусто/не null/его длина больше 0, установите dismissDropDown() для этого автозаполненияTextView.

Пожалуйста, найдите нижеприведенный фрагмент

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
    }

Надеюсь, это помогло бы кому-то, Cheers!

Ответ 11

Вы можете попробовать

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

Источник

Ответ 12

setText("someText",false)

false означает, что он не фильтрует

Ответ 13

ОтключитьDropDown() хорошо работает в адаптере:

        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

Я решил ту же проблему с этим кодом:

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

Здесь contact_search - это мой AutoCompleteTextView

Ответ 15

Мне нужно добавить задержку, чтобы эта работа работала.

Это сработало для меня:

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

Ответ 16

Цель состоит в том, чтобы скрыть раскрывающийся список с помощью AutoCompleteTextView. Установите dropDownHeight в ноль в файле макета.

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

В моем случае у меня есть GridView, и над этим представлением есть адресная строка. Я хочу фильтровать элементы в GridView на основе ввода пользователем в AutoCompleteTextView, не требуя, чтобы TextView показывал мне раскрывающееся меню.