Android: AutoCompleteTextView muestra sugerencias cuando no se introduce ningún texto
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 tiene que introducir al menos 1 carácter para mostrar Las sugerencias.
- AutoCompleteTextView - deshabilitar el filtrado
- AutoCompleteTextView con lista personalizada: cómo configurar OnItemClickListener
- Cómo resolver "El contenido del adaptador ha cambiado pero ListView no ha recibido una notificación" excepción
- Los elementos de la caja desplegable de autocompletetextview de Android tienen una fuente grande
- AutoCompleteTextView con dominios de correo electrónico android
- Cómo deshabilitar el corrector ortográfico para Android AutoCompleteTextView?
- Eliminar AutoCompleteTextView lista desplegable divider
- Personalizar divisor / separador en la lista desplegable de un AutocompleteTextview
- Android AutoCompleteTextView con filtro de adaptador personalizado no funciona
- AutoCompleteTextView desplegable altura limitada en el cuadro de diálogo emergente
- Los elementos de la lista desplegable de AutoCompleteTextView no son visibles. Cómo cambiar su color ..?
- Android AutoCompleteTextView muestra información de objeto en lugar de texto en modo horizontal
- Cómo mostrar las sugerencias de AutoCompleteTextView en orientación horizontal
Se trata de 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()
, así que tal vez usted puede arreglar para mostrarlo cuando lo desee. O subclase AutoCompleteTextView
y reemplazar enoughToFilter()
, devolviendo true
todo el tiempo.
Aquí está mi clase – lo 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); } } }
Utilícelo en su xml como este:
<your.namespace.InstantAutoComplete ... />
La manera más fácil:
Sólo use setOnTouchListener y showDropDown ()
AutoCompleteTextView text; ..... ..... text.setOnTouchListener(new View.OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event){ text.showDropDown(); return false; } });
El código de Destil funciona muy bien cuando sólo hay un objeto InstantAutoComplete
. No funcionó con dos sin embargo – ni idea de por qué. Pero cuando pongo showDropDown()
(al igual que CommonsWare aconsejado) en onFocusChanged()
así:
@Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(focused, direction, previouslyFocusedRect); if (focused) { performFiltering(getText(), 0); showDropDown(); } }
Resolvió el problema.
Son sólo las dos respuestas correctamente combinadas, pero espero que pueda salvar a alguien algún tiempo.
La respuesta de Destil arriba casi funciona, pero tiene un insecto sutil. Cuando el usuario primero da el foco al campo que trabaja, sin embargo, si se van y luego regresan al campo no mostrará el menú desplegable porque el valor de mPopupCanBeUpdated seguirá siendo falso desde cuando estaba oculto. La solución consiste en 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(""); } } }
Puede utilizar onFocusChangeListener;
TCKimlikNo.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { TCKimlikNo.showDropDown(); } } });
El adaptador no realiza el filtrado inicialmente.
Cuando no se realiza el filtrado, la lista desplegable está vacía.
Por lo que puede ser que tenga que conseguir el filtrado que va inicialmente.
Para ello, puede invocar filter()
después de terminar de agregar las entradas:
adapter.add("a1"); adapter.add("a2"); adapter.add("a3"); adapter.getFilter().filter(null);
Para hacer CustomAutoCompleteTextView. 1. reemplazar setThreshold, enoughToFilter, onFocusChanged método
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; } }
Simplemente llame a este método al tocar o hacer clic en evento de autoCompleteTextView o donde desee.
autoCompleteTextView.showDropDown()
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; } }):
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); } }
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 su archivo Xml …
<AutoCompleteTextView android:layout_width="200dp" android:layout_height="30dp" android:hint="@string/select_location" android:id="@+id/acT1" android:textAlignment="center"/>
Y crear un Array 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 tú eres bueno para ir.
- Ajustar imagen en ImageButton en Android
- ¿Hay alguna manera de definir un valor mínimo y máximo para EditText en Android?