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.
Réponses
Trop de publicités?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.
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);
}
}
}
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.
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("");
}
}
}