Android: AutoCompleteTextView affiche des suggestions quand aucun texte entré

J’utilise AutoCompleteTextView , lorsque l’utilisateur clique dessus, je veux afficher des suggestions même s’il n’a pas de texte – mais setThreshold(0) fonctionne exactement comme setThreshold(1) – l’utilisateur doit donc entrer au moins 1 caractère à afficher les suggestions

    Ceci est un 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() , alors vous pouvez peut-être organiser pour la montrer quand vous le souhaitez. Ou, sous-classe AutoCompleteTextView et substituez enoughToFilter() , renvoyant true tout le temps.

    Voici ma classe InstantAutoComplete . C’est quelque chose entre AutoCompleteTextView et Spinner .

     import android.content.Context; import android.graphics.Rect; import android.util.AtsortingbuteSet; import android.widget.AutoCompleteTextView; public class InstantAutoComplete extends AutoCompleteTextView { public InstantAutoComplete(Context context) { super(context); } public InstantAutoComplete(Context arg0, AtsortingbuteSet arg1) { super(arg0, arg1); } public InstantAutoComplete(Context arg0, AtsortingbuteSet 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); } } } 

    Utilisez-le dans votre XML comme ceci:

      

    Manière la 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; } }); 

    Le code de Destil fonctionne parfaitement quand il n’y a qu’un seul object InstantAutoComplete . Cela n’a pas marché avec deux cependant – aucune idée pourquoi. Mais quand je mets showDropDown() (comme le conseille onFocusChanged() ) dans onFocusChanged() comme ceci:

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

    Ce ne sont que les deux réponses correctement combinées, mais j’espère que cela permettra à quelqu’un de gagner du temps.

    L’adaptateur n’effectue pas de filtrage initialement.
    Lorsque le filtrage n’est pas effectué, la liste déroulante est vide.
    vous devrez peut-être commencer par le filtrage.

    Pour ce faire, vous pouvez appeler filter() après avoir ajouté les entrées:

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

    La réponse de Destil ci-dessus fonctionne presque, mais a un bug subtil. Lorsque l’utilisateur commence à se concentrer sur le champ, il fonctionne, mais s’il quitte puis retourne dans le champ, le menu déroulant n’apparaîtra pas car la valeur de mPopupCanBeUpdated sera toujours fausse à partir du moment où elle sera masquée. La solution consiste à modifier la méthode onFocusChanged pour:

     @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(focused, direction, previouslyFocusedRect); if (focused) { if (getText().toSsortingng().length() == 0) { // We want to sortinggger the drop down, replace the text. setText(""); } } } 

    Vous pouvez utiliser onFocusChangeListener;

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

    Pour faire CustomAutoCompleteTextView. 1. redéfinissez la méthode setThreshold, enoughToFilter, onFocusChanged

     public class CustomAutoCompleteTextView extends AutoCompleteTextView { private int myThreshold; public CustomAutoCompleteTextView (Context context) { super(context); } public CustomAutoCompleteTextView (Context context, AtsortingbuteSet attrs, int defStyle) { super(context, attrs, defStyle); } public CustomAutoCompleteTextView (Context context, AtsortingbuteSet 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; } } 

    Il suffit d’appeler cette méthode sur un événement tactile ou un clic de autoCompleteTextView ou où vous voulez.

     autoCompleteTextView.showDropDown() 

    l’essayer

      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().toSsortingng().length() == 0) { searchAutoComplete.setText(" "); } break; } }): 

    Il suffit de coller ceci dans votre méthode onCreate en Java

     final ArrayAdapter 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(); } }); 

    Et ceci à votre fichier XML …

      

    Et créez un tableau dans ssortingng.xml sous Valeurs …

      Pakistan Germany Russia/NCR China India Sweden Australia  

    Et vous êtes prêt à partir.

    Cela a fonctionné pour moi, pseudo code:

      public class CustomAutoCompleteTextView extends AutoCompleteTextView { public CustomAutoCompleteTextView(Context context, AtsortingbuteSet 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); } } 

    Sept ans plus tard, les gars, le problème rest le même. Voici une classe avec une fonction qui oblige cette pop-up stupide à se montrer dans toutes les conditions. Tout ce que vous avez à faire est de définir un adaptateur sur votre AutoCompleteTextView, d’y append des données et d’appeler la fonction showDropdownNow() tout moment.

    Crédits à @David Vávra. C’est basé sur son code.

     import android.content.Context import android.util.AtsortingbuteSet import android.widget.AutoCompleteTextView class InstantAutoCompleteTextView : AutoCompleteTextView { constructor(context: Context) : super(context) constructor(context: Context?, attrs: AtsortingbuteSet?) : super(context, attrs) constructor(context: Context?, attrs: AtsortingbuteSet?, 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) } } }