Frage

Ich bin mit AutoCompleteTextView, wenn der Benutzer darauf klickt, mag ich Vorschläge zeigen, auch wenn es keinen Text hat - aber setThreshold(0) funktioniert genauso wie setThreshold(1) - so dass der Benutzer mindestens 1 Zeichen einzugeben hat die Vorschläge zu zeigen, .

War es hilfreich?

Lösung

Dies ist dokumentierte Verhalten :

  

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

Sie können manuell auf den Dropdown-über showDropDown() zeigen, so vielleicht können Sie ordnen es zu zeigen, wenn Sie wollen. Oder Unterklasse AutoCompleteTextView und Überschreibung enoughToFilter(), true alle Zeit zurück.

Andere Tipps

Hier ist meine Klasse InstantAutoComplete . Es ist etwas zwischen AutoCompleteTextView und 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 Ihrem xml wie folgt aus:

<your.namespace.InstantAutoComplete ... />

Der einfachste Weg:

Just Verwendung setOnTouchListener und showDropDown ()

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

Destil des Code funktioniert nur gut, wenn es nur ein InstantAutoComplete Objekt ist. Es hat nicht funktioniert mit zwei obwohl - keine Ahnung, warum. Aber wenn ich showDropDown() setzen (wie CommonsWare geraten) in onFocusChanged() wie folgt aus:

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

es das Problem gelöst.

Es ist nur die beiden Antworten richtig kombiniert, aber ich hoffe, dass es jemand einige Zeit sparen kann.

Der Adapter führt keine Filterung zunächst.
Wenn die Filterung nicht durchgeführt wird, ist die Drop-Down-Liste leer.
so dass Sie könnte die Filterung gehen zunächst bekommen haben.

Um dies zu tun, können Sie filter() aufrufen, nachdem Sie die Einträge hinzugefügt haben:

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

Destil Antwort über fast funktioniert, aber hat einen subtilen Fehler. Wenn der Benutzer zuerst den Fokus auf das Feld gibt es funktioniert, aber wenn sie zu verlassen und dann wieder auf das Feld wird es nicht die Drop-down zeigen, da der Wert von mPopupCanBeUpdated noch falsch sein aus, wenn es verborgen war. Die Lösung ist die onFocusChanged Methode 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("");
        }
    }
}

Sie können mit onFocusChangeListener;

TCKimlikNo.setOnFocusChangeListener(new OnFocusChangeListener() {

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

            }

        }
    });

Um CustomAutoCompleteTextView zu machen. 1. Überschreibung SetThreshold, enoughToFilter, onFocusChanged Methode

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

Rufen Sie diese Methode auf Berührung oder Click-Ereignis von autoCompleteTextView oder wo Sie wollen.

autoCompleteTextView.showDropDown()

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

Das ist für mich gearbeitet, Pseudo-Code:

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

Fügen Sie einfach diese zu Ihrer onCreate Methode in Java

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 auf 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 Werten ...

<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 Sie sind gut zu gehen.

Sieben Jahre später, Jungs, bleibt das Problem das gleiche. Hier ist eine Klasse mit einer Funktion, die Kräfte, die dumme Pop-up sich in allen möglichen Bedingungen zu zeigen. Alles, was Sie tun müssen, ist, einen Adapter zu Ihrem AutoCompleteTextView zu setzen, einige Daten in sie, und Call showDropdownNow() Funktion jederzeit hinzufügen.

Credits @ David Vávra. Es basiert auf dem 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)
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top