Używam AutoCompleteTextView
, gdy użytkownik go kliknie, chcę wyświetlać sugestie, nawet jeśli nie ma tekstu - ale setThreshold(0)
działa dokładnie tak samo, jak setThreshold(1)
- więc użytkownik musi wprowadzić co najmniej 1 znak, aby wyświetlić sugestie.
android
autocompletetextview
fhucho
źródło
źródło
Odpowiedzi:
To jest udokumentowane zachowanie :
Możesz ręcznie wyświetlić listę rozwijaną za pośrednictwem
showDropDown()
, więc być może możesz zorganizować wyświetlanie jej, kiedy chcesz. Lub podklasaAutoCompleteTextView
i przesłonięcieenoughToFilter()
, zwracająctrue
cały czas.źródło
showDropDown()
nie działa wafterTextChanged
when.getText().toString().length()==0
. DLACZEGOOto moja klasa InstantAutoComplete . To coś pomiędzy
AutoCompleteTextView
aSpinner
.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); } } }
Użyj go w swoim xml w ten sposób:
<your.namespace.InstantAutoComplete ... />
źródło
<AutoCompleteTextView ... />
na<your.namespace.InstantAutoComplete ... />
. Straciłem trochę czasu, zastanawiając się nad tym :)androidx.appcompat.widget.AppCompatAutoCompleteTextView
.Najprostszy sposób:
Po prostu użyj setOnTouchListener i showDropDown ()
AutoCompleteTextView text; ..... ..... text.setOnTouchListener(new View.OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event){ text.showDropDown(); return false; } });
źródło
Kod Destila działa świetnie, gdy jest tylko jeden
InstantAutoComplete
obiekt. Nie działało to jednak z dwoma - nie mam pojęcia, dlaczego. Ale kiedyshowDropDown()
wstawię (tak jak radzi CommonsWare) wonFocusChanged()
ten sposób:@Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(focused, direction, previouslyFocusedRect); if (focused) { performFiltering(getText(), 0); showDropDown(); } }
to rozwiązało problem.
To tylko dwie poprawnie połączone odpowiedzi, ale mam nadzieję, że może to komuś zaoszczędzić trochę czasu.
źródło
Adapter początkowo nie przeprowadza filtrowania.
Jeśli filtrowanie nie jest wykonywane, lista rozwijana jest pusta.
więc być może będziesz musiał uruchomić filtrowanie na początku.
Aby to zrobić, możesz wywołać
filter()
po zakończeniu dodawania wpisów:adapter.add("a1"); adapter.add("a2"); adapter.add("a3"); adapter.getFilter().filter(null);
źródło
Możesz użyć onFocusChangeListener;
TCKimlikNo.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { TCKimlikNo.showDropDown(); } } });
źródło
Powyższa odpowiedź Destila prawie działa, ale ma jeden subtelny błąd. Gdy użytkownik po raz pierwszy ustawi fokus na polu, to działa, jednak jeśli opuści, a następnie wróci do pola, lista rozwijana nie zostanie wyświetlona, ponieważ wartość mPopupCanBeUpdated nadal będzie fałszywa od momentu ukrycia. Rozwiązaniem jest zmiana metody onFocusChanged na:
@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(""); } } }
źródło
Aby utworzyć CustomAutoCompleteTextView. 1. zastąpić metodę setThreshold, wystarczającoToFilter, 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; } }
źródło
Spróbuj
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; } }):
źródło
Po prostu wywołaj tę metodę za dotknięciem lub kliknięciem zdarzenia autoCompleteTextView lub gdzie chcesz.
autoCompleteTextView.showDropDown()
źródło
To zadziałało dla mnie, pseudo kod:
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); } }
źródło
Po prostu wklej to do swojej metody onCreate w Javie
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(); } });
A to do twojego pliku Xml ...
<AutoCompleteTextView android:layout_width="200dp" android:layout_height="30dp" android:hint="@string/select_location" android:id="@+id/acT1" android:textAlignment="center"/>
I utwórz tablicę w string.xml w Values ...
<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>
I jesteś gotowy.
źródło
Siedem lat później, chłopaki, problem pozostaje ten sam. Oto klasa z funkcją, która zmusza to głupie wyskakujące okienko do wyświetlania się w każdych warunkach. Wszystko, co musisz zrobić, to ustawić adapter do swojego AutoCompleteTextView, dodać do niego trochę danych i wywołać
showDropdownNow()
funkcję w dowolnym momencie.Kredyty dla @David Vávra. Opiera się na jego kodzie.
import android.content.Context import android.util.AttributeSet import android.widget.AutoCompleteTextView class InstantAutoCompleteTextView : AutoCompleteTextView { constructor(context: Context) : super(context) constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) override fun enoughToFilter(): Boolean { return true } fun showDropdownNow() { if (adapter != null) { // Remember a current text val savedText = text // Set empty text and perform filtering. As the result we restore all items inside of // a filter's internal item collection. setText(null, true) // Set back the saved text and DO NOT perform filtering. As the result of these steps // we have a text shown in UI, and what is more important we have items not filtered setText(savedText, false) // Move cursor to the end of a text setSelection(text.length) // Now we can show a dropdown with full list of options not filtered by displayed text performFiltering(null, 0) } } }
źródło
na FocusChangeListener, sprawdź
if (hasFocus) { tvAutoComplete.setText(" ")
w filtrze wystarczy przyciąć tę wartość:
filter { it.contains(constraint.trim(), true) }
i pokaże wszystkie sugestie, gdy skupisz się na tym widoku.
źródło