Как отключить раскрывающийся список 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 показывал мне раскрывающееся меню.