studio how edittext developers android autocompletetextview

how - Android: AutoCompleteTextView muestra sugerencias cuando no se ingresó texto



dropdown autocomplete android (13)

Estoy usando AutoCompleteTextView , cuando el usuario hace clic en él, quiero mostrar sugerencias incluso si no tiene texto, pero setThreshold(0) funciona exactamente igual que setThreshold(1) , por lo que el usuario debe ingresar al menos 1 carácter para mostrar las sugerencias


Aquí está mi clase, la llamo InstantAutoComplete. Es algo entre AutoCompleteTextView y 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); } } }

Úselo en su xml así:

<your.namespace.InstantAutoComplete ... />


El adaptador no realiza el filtrado inicialmente.
Cuando no se realiza el filtrado, la lista desplegable está vacía.
por lo que es posible que deba obtener el filtrado inicialmente.

Para hacerlo, puede invocar filter() después de que termine de agregar las entradas:

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


El código de Destil funciona genial cuando solo hay un objeto InstantAutoComplete . Aunque no funcionó con dos , ni idea por qué. Pero cuando puse showDropDown() (como lo hizo con CommonsWare) en onFocusChanged() como este:

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

resolvió el problema.

Es solo las dos respuestas combinadas correctamente, pero espero que pueda salvar a alguien en algún momento.


Este es un comportamiento documentado : "Cuando el umbral es menor o igual a 0, se aplica un umbral de 1".

Puede mostrar manualmente el menú desplegable a través de showDropDown() , por lo que tal vez pueda organizar para mostrarlo cuando lo desee. O bien, subclase AutoCompleteTextView y sobreescriba enoughToFilter() , devolviendo true todo el tiempo.


Esto funcionó para mí, pseudo código:

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


La manera más fácil:

Simplemente use setOnTouchListener y showDropDown ()

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


La respuesta de Destil de arriba casi funciona, pero tiene un error sutil. Cuando el usuario primero enfoca el campo funciona, sin embargo, si se van y vuelven al campo, no mostrarán el menú desplegable porque el valor de mPopupCanBeUpdated seguirá siendo falso desde el momento en que se escondió. La solución es cambiar el método onFocusChanged a:

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


Para hacer CustomAutoCompleteTextView. 1. anular setThreshold, enoughToFilter, método de FocusFrench

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


Puede usar en FocusMessageListener;

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


Siete años después, chicos, el problema sigue siendo el mismo. Aquí hay una clase con una función que fuerza esa estúpida ventana emergente para mostrarse en cualquier condición. Todo lo que necesita hacer es establecer un adaptador para su AutoCompleteTextView, agregar algunos datos en él y llamar a la función showDropdownNow() cualquier momento.

Créditos a @David Vávra. Está basado en su código.

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


Simplemente llame a este método al tocar o haga clic en el evento de autoCompleteTextView o donde lo desee.

autoCompleteTextView.showDropDown()


Simplemente pegue esto en su método onCreate en 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(); } });

Y esto a tu archivo Xml ...

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

Y crea una matriz en string.xml en Valores ...

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

Y eres bueno para ir.


intentalo

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