Android: AutoCompleteTextView zeigt Vorschläge an, wenn kein Text eingegeben wurde


127

Ich verwende AutoCompleteTextView, wenn der Benutzer darauf klickt, möchte ich Vorschläge anzeigen, auch wenn es keinen Text enthält - setThreshold(0)funktioniert aber genauso wie setThreshold(1)-, sodass der Benutzer mindestens 1 Zeichen eingeben muss, um die Vorschläge anzuzeigen.


Ich mache HIER etwas Ähnliches !!! stackoverflow.com/questions/12854336/…
toobsco42

Antworten:


159

Dies ist dokumentiertes Verhalten :

Wenn thresholdkleiner oder gleich 0 ist, wird ein Schwellenwert von 1 angewendet.

Sie können das Dropdown-Menü manuell über anzeigen showDropDown(), sodass Sie es möglicherweise jederzeit anzeigen können. Oder Unterklasse AutoCompleteTextViewund Überschreibung enoughToFilter(), wobei die trueganze Zeit zurückgegeben wird.


7
Das showDropDown () scheint gut zu funktionieren, wenn man onClickListener einstellt, aber die Unterklasse funktioniert erst, wenn der Benutzer einen Buchstaben eingibt und zurückkommt. Aber nicht nur mit onClick ...
amj

9
Dies funktioniert perfekt in Kombination mit OnFocusChangeListener, der showDropDown () aufruft, wenn die Ansicht den Fokus erhält.
Grishka

Ich muss auch den onFocusChanged überschreiben, wie in der Antwort unten von @David Vávra
Gabriel

4
@commonsWare showDropDown()funktioniert nicht in afterTextChangedwann .getText().toString().length()==0. WARUM
Prabs

1
Nur das Überschreiben von genug ToFilter hilft mir. Danke dir!
Fedir Tsapana

121

Hier ist meine Klasse InstantAutoComplete . Es ist etwas zwischen AutoCompleteTextViewund 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);
        }
    }

}

Verwenden Sie es in Ihrer XML wie folgt:

<your.namespace.InstantAutoComplete ... />

12
Das ist großartig! Ich würde auch darauf hinweisen, dass in Ihrem Layout XML Datei , die Sie ändern müssen <AutoCompleteTextView ... />zu <your.namespace.InstantAutoComplete ... />. Ich habe einige Zeit verloren, um das herauszufinden :)
Jules Colle

3
Großartige Klasse - nur ein Vorschlag wäre in der onFocusChanged-Methode, ändern Sie das "if (fokussiert)" in "if (fokussiert && getAdapter ()! = Null)".
Jacob Tabak

Erweitern Sie für AndroidXandroidx.appcompat.widget.AppCompatAutoCompleteTextView .
Mahmudul Hasan Shohag

Dies zeigt keine Dropdown-Liste für Orientierungsänderungen an.
Miha_x64

45

Einfachster Weg:

Verwenden Sie einfach setOnTouchListener und showDropDown ()

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

Um dies noch besser zu machen, verwenden Sie if (! Text.isPopupShowing ()) {text.showDropDown (); }
Boldijar Paul

7
nicht sehr häufig, aber dies funktioniert nicht, wenn der Benutzer nicht berührt, um zu diesem EditText zu gelangen. Zum Beispiel bei Verwendung einer Fernbedienung mit Tasten (z. B. Android TV).
Android-Entwickler

2
Sie sollten setOnFocusChanged verwenden. Jemand kann Tastatur haben und die TAB-Taste drücken oder mit Maus und Touch Listener wird nicht aufgerufen.
Barwnikk

onTouchListener wird für ein einziges Tippen zu unterschiedlichen Zeiten aufgerufen. Beispiel: Das Ereignis kann MotionEvent.ACTION_DOWN, MotionEvent.ACTION_UP sein. Es ist also besser, nach einem bestimmten Ereignis
Govind

18

Destils Code funktioniert einfach hervorragend, wenn es nur ein InstantAutoCompleteObjekt gibt. Bei zwei funktionierte es allerdings nicht - keine Ahnung warum. Aber wenn ich showDropDown()(genau wie von CommonsWare empfohlen) Folgendes einfüge onFocusChanged():

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

es löste das Problem.

Es sind nur die beiden Antworten, die richtig kombiniert wurden, aber ich hoffe, es kann jemandem Zeit sparen.


2
Ihre Hinzufügung hat geholfen, aber ich habe eine Fehlermeldung erhalten, wenn Text in InstantAutoComplete vorhanden war und die Bildschirmausrichtung geändert wurde. Ich habe es mit einer Überprüfung der Sichtbarkeit des Fensters behoben und den neuen Code hier veröffentlicht: gist.github.com/furycomptuers/4961368
FuryComputers

9

Der Adapter führt zunächst keine Filterung durch.
Wenn die Filterung nicht durchgeführt wird, ist die Dropdown-Liste leer.
Daher müssen Sie möglicherweise zunächst die Filterung starten.

Dazu können Sie filter()nach dem Hinzufügen der Einträge Folgendes aufrufen :

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

6

Sie können onFocusChangeListener verwenden.

TCKimlikNo.setOnFocusChangeListener(new OnFocusChangeListener() {

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

            }

        }
    });

6

Die obige Antwort von Destil funktioniert fast, hat aber einen subtilen Fehler. Wenn der Benutzer das Feld zum ersten Mal fokussiert, funktioniert es. Wenn er das Feld jedoch verlässt und dann zum Feld zurückkehrt, wird das Dropdown-Menü nicht angezeigt, da der Wert von mPopupCanBeUpdated ab dem Zeitpunkt des Ausblendens immer noch falsch ist. Das Update besteht darin, die onFocusChanged-Methode in Folgendes zu ändern:

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

Dies bedeutet aber auch, dass der Text zurückgesetzt wird (obwohl das normalerweise
Android-Entwickler

3

So erstellen Sie CustomAutoCompleteTextView 1. überschreiben Sie die Methode setThreshold, ausreichendToFilter, onFocusChanged

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

3

Versuch es

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

3

Rufen Sie diese Methode einfach beim Berühren auf oder klicken Sie auf das Ereignis von autoCompleteTextView oder wo Sie möchten.

autoCompleteTextView.showDropDown()

0

Das hat bei mir funktioniert, Pseudocode:

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


0

Fügen Sie dies einfach in Ihre onCreate-Methode in Java ein

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();

        }
    });

Und das zu deiner XML-Datei ...

<AutoCompleteTextView
            android:layout_width="200dp"
            android:layout_height="30dp"
            android:hint="@string/select_location"
            android:id="@+id/acT1"
            android:textAlignment="center"/>

Und erstellen Sie ein Array in string.xml unter Werte ...

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

Und du bist gut zu gehen.


0

Sieben Jahre später, Jungs, bleibt das Problem das gleiche. Hier ist eine Klasse mit einer Funktion, die dieses dumme Popup zwingt, sich unter allen Bedingungen zu zeigen. Sie müssen lediglich einen Adapter für Ihre AutoCompleteTextView festlegen, einige Daten hinzufügen und die showDropdownNow()Funktion jederzeit aufrufen .

Dank an @David Vávra. Es basiert auf seinem Code.

import android.content.Context
import android.util.AttributeSet
import android.widget.AutoCompleteTextView

class InstantAutoCompleteTextView : AutoCompleteTextView {

    constructor(context: Context) : super(context)

    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)

    constructor(context: Context?, attrs: AttributeSet?, 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)
        }
    }
}

0

Überprüfen Sie auf FocusChangeListener

if (hasFocus) {
            tvAutoComplete.setText(" ")

Trimmen Sie in Ihrem Filter einfach diesen Wert:

filter { it.contains(constraint.trim(), true) }

und es werden alle Vorschläge angezeigt, wenn Sie sich auf diese Ansicht konzentrieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.