140 votes

Android : AutoCompleteTextView affiche des suggestions lorsqu'aucun texte n'est saisi

J'utilise AutoCompleteTextView, lorsque l'utilisateur clique dessus, je veux afficher des suggestions même s'il n'y a pas de texte - mais setThreshold(0) fonctionne exactement comme setThreshold(1) - donc l'utilisateur doit entrer au moins un caractère pour que les suggestions apparaissent.

173voto

CommonsWare Points 402670

C'est comportement documenté : "Lorsque le seuil est inférieur ou égal à 0, un seuil de 1 est appliqué.".

Vous pouvez afficher manuellement la liste déroulante via showDropDown() Vous pouvez donc peut-être vous arranger pour le montrer quand vous le souhaitez. Ou, sous-classez AutoCompleteTextView et de passer outre enoughToFilter() en retournant true tout au long du temps.

132voto

Destil Points 3673

Voici ma classe - je l'appelle InstantAutoComplete. C'est quelque chose entre AutoCompleteTextView et 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);
        }
    }

}

54voto

user1913469 Points 161

Le moyen le plus simple :

Utilisez simplement setOnTouchListener et showDropDown().

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

18voto

alex Points 1545

Le code de Destil fonctionne très bien lorsqu'il n'y a qu'un seul InstantAutoComplete objet. Ça n'a pas marché avec deux personnes. - Je ne sais pas pourquoi. Mais quand je mets showDropDown() (comme le conseille CommonsWare) en onFocusChanged() comme ça :

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

cela a résolu le problème.

Il ne s'agit que de deux réponses correctement combinées, mais j'espère que cela pourra faire gagner du temps à quelqu'un.

7voto

Colin Stewart Points 277

La réponse de Destil ci-dessus fonctionne presque, mais présente un bug subtil. Cependant, si l'utilisateur quitte le champ et y revient, la liste déroulante ne s'affichera pas, car la valeur de mPopupCanBeUpdated sera toujours fausse, car elle était cachée. La solution consiste à modifier la méthode onFocusChanged en :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X