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.

fhucho
quelle
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.

CommonsWare
quelle
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 ... />
David Vávra
quelle
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;
   }
});
user1913469
quelle
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.

Alex
quelle
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);
David M Lee
quelle
6

Sie können onFocusChangeListener verwenden.

TCKimlikNo.setOnFocusChangeListener(new OnFocusChangeListener() {

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

            }

        }
    });
Göksel Güren
quelle
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("");
        }
    }
}
Colin Stewart
quelle
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; 
    } 
}
sanjeev vishnoi
quelle
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;
            }
        }):
Rafayel Pogosyan
quelle
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()
Dalvinder Singh
quelle
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);
    }
}

Nasif Md. Tanjim
quelle
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.

Lalit Fauzdar
quelle
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)
        }
    }
}
mykolaj
quelle
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.

beokh
quelle