66 votos

Android: AutoCompleteTextView mostrar sugerencias cuando no hay texto introducido

Estoy usando AutoCompleteTextView , cuando el usuario hace clic en él, quiero mostrar sugerencias, incluso si no tiene texto, pero setThreshold(0) funciona exactamente de la misma como setThreshold(1) - por lo que el usuario tiene que introducir al menos 1 carácter para mostrar las sugerencias.

76voto

CommonsWare Puntos 402670

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

Usted puede mostrar manualmente el desplegable a través de showDropDown(), así que tal vez usted puede hacer arreglos para demostrar que cuando se quiere. O, subclase AutoCompleteTextView y anular enoughToFilter(), volviendo true de todos los tiempos.

72voto

Destil Puntos 3673

Aquí está mi clase - me 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) {
            performFiltering(getText(), 0);
        }
    }

}

30voto

user1913469 Puntos 161

El modo más sencillo:

Sólo uso setOnTouchListener y showDropDown()

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

11voto

alex Puntos 1545

Destil del código funciona muy bien cuando sólo hay un InstantAutoComplete objeto. No trabajo con dos a pesar de que no tenemos ni idea de por qué. Pero cuando me pongo showDropDown() (igual que CommonsWare aconsejado) 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();
    }
}

se solucionó el problema.

Es apenas el dos respuestas correctamente combinados, pero tengo la esperanza de que puede salvar a alguien de algún tiempo.

2voto

sanjeev vishnoi Puntos 21

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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X