Android: AutoCompleteTextView показывает предложения, когда текст не вводится

Я использую AutoCompleteTextView , когда пользователь нажимает на него, я хочу показывать предложения, даже если у него нет текста, но setThreshold(0) работает точно так же, как setThreshold(1) – поэтому пользователю нужно ввести не менее 1 символа, чтобы показать Предложения.

Solutions Collecting From Web of "Android: AutoCompleteTextView показывает предложения, когда текст не вводится"

Это документированное поведение : «Когда пороговое значение меньше или равно 0, применяется порог 1».

Вы можете вручную отобразить раскрывающееся меню с помощью showDropDown() , поэтому, возможно, вы сможете организовать его, когда захотите. Или, подкласс AutoCompleteTextView и override enoughToFilter() , возвращающий true все время.

Вот мой класс – я называю его 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); } } } 

Используйте его в своем xml следующим образом:

 <your.namespace.InstantAutoComplete ... /> 

Самый простой способ:

Просто используйте setOnTouchListener и showDropDown ()

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

Код Destil отлично работает, когда есть только один объект InstantAutoComplete . Это не сработало с двумя, хотя – не знаю, почему. Но когда я помещал showDropDown() (как и CommonsWare) в onFocusChanged() следующим образом:

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

Он решил проблему.

Это всего лишь два ответа, которые были правильно объединены, но я надеюсь, что это может сэкономить кому-нибудь некоторое время.

Ответ от Destil почти работает, но имеет один тонкий баг. Когда пользователь сначала фокусируется на поле, он работает, однако, если они уходят, а затем возвращаются в поле, он не будет показывать выпадающее меню, потому что значение mPopupCanBeUpdated будет по-прежнему ложным, если оно будет скрыто. Исправление состоит в том, чтобы изменить метод 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(""); } } } 

Вы можете использовать onFocusChangeListener;

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

Первоначально адаптер не выполняет фильтрацию.
Когда фильтрация не выполняется, выпадающий список пуст.
Поэтому вам, возможно, придется сначала отфильтровать.

Для этого вы можете вызвать filter() после завершения добавления записей:

 adapter.add("a1"); adapter.add("a2"); adapter.add("a3"); adapter.getFilter().filter(null); 

Сделать CustomAutoCompleteTextView. 1. переопределить setThreshold, enoughToFilter, onFocusChanged метод

 public class CustomAutoCompleteTextView extends AutoCompleteTextView { private int myThreshold; public CustomAutoCompleteTextView (Context context) { super(context); } public CustomAutoCompleteTextView (Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public CustomAutoCompleteTextView (Context context, AttributeSet attrs) { super(context, attrs); } //set threshold 0. public void setThreshold(int threshold) { if (threshold < 0) { threshold = 0; } myThreshold = threshold; } //if threshold is 0 than return true public boolean enoughToFilter() { return true; } //invoke on focus protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { //skip space and backspace super.performFiltering("", 67); // TODO Auto-generated method stub super.onFocusChanged(focused, direction, previouslyFocusedRect); } protected void performFiltering(CharSequence text, int keyCode) { // TODO Auto-generated method stub super.performFiltering(text, keyCode); } public int getThreshold() { return myThreshold; } } 

Просто вызовите этот метод при нажатии или щелчке события autoCompleteTextView или где вы хотите.

 autoCompleteTextView.showDropDown() 

попробуй

  searchAutoComplete.setThreshold(0); searchAutoComplete.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {//cut last probel if (charSequence.length() > 1) { if (charSequence.charAt(charSequence.length() - 1) == ' ') { searchAutoComplete.setText(charSequence.subSequence(0, charSequence.length() - 1)); searchAutoComplete.setSelection(charSequence.length() - 1); } } } @Override public void afterTextChanged(Editable editable) { } }); //when clicked in autocomplete text view @Override public void onClick(View view) { switch (view.getId()) { case R.id.header_search_etv: if (searchAutoComplete.getText().toString().length() == 0) { searchAutoComplete.setText(" "); } break; } }): 

Это сработало для меня, псевдокод:

  public class CustomAutoCompleteTextView extends AutoCompleteTextView { public CustomAutoCompleteTextView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean enoughToFilter() { return true; } @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(focused, direction, previouslyFocusedRect); if (focused) { performFiltering(getText(), 0); } } @Override public boolean onTouchEvent(MotionEvent event) { this.showDropDown(); return super.onTouchEvent(event); } } 

Просто вставьте это в свой метод onCreate в Java

 final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>( this, android.R.layout.simple_spinner_dropdown_item, getResources().getStringArray(R.array.Loc_names)); textView1 =(AutoCompleteTextView) findViewById(R.id.acT1); textView1.setAdapter(arrayAdapter); textView1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View arg0) { textView1.setMaxLines(5); textView1.showDropDown(); } }); 

И это в ваш файл Xml …

 <AutoCompleteTextView android:layout_width="200dp" android:layout_height="30dp" android:hint="@string/select_location" android:id="@+id/acT1" android:textAlignment="center"/> 

И создайте Array в файле string.xml под знаками …

 <string-array name="Loc_names"> <item>Pakistan</item> <item>Germany</item> <item>Russia/NCR</item> <item>China</item> <item>India</item> <item>Sweden</item> <item>Australia</item> </string-array> 

И тебе хорошо идти.