Android: AutoCompleteTextView metin girilmediğinde önerileri gösterir


127

Ben kullanıyorum AutoCompleteTextViewbunun tıkladığında, ben metin içermiyor olsa bile önerilerini göstermek istediğinizde, - ancak setThreshold(0)tam olarak çalışır aynı şekilde setThreshold(1)- kullanıcı önerilerini göstermek için en az 1 karakter girmek zorunda böylece.


BURADA benzer bir şey yapıyorum !!! stackoverflow.com/questions/12854336/…
toobsco42

Yanıtlar:


159

Bu, belgelenmiş bir davranıştır :

threshold0'dan küçük veya eşit olduğunda , 1 eşiği uygulanır.

Açılır listeyi manuel olarak gösterebilirsiniz showDropDown(), böylece istediğiniz zaman göstermeyi ayarlayabilirsiniz. Veya, alt sınıf AutoCompleteTextViewve geçersiz kılma enoughToFilter(), trueher zaman geri döner .


7
ShowDropDown () iyi OnClickListener seting çalışma gibi görünüyor, ama alt sınıf şey ... kullanıcı bir mektup yazın ve DELS sadece onClick ile değil back.But geliyor e kadar çalışmıyor
AMJ

9
Bu, görünüm odağı kazandığında showDropDown () öğesini çağıran OnFocusChangeListener ile mükemmel şekilde çalışır.
Grishka

Aşağıdaki yanıtta @David Vávra tarafından belirtildiği gibi onFocusChanged'i de geçersiz kılmalıyım
Gabriel

4
@commonsWare ne zaman showDropDown()çalışmıyor . WHYYYafterTextChanged.getText().toString().length()==0
Prabs

1
Sadece yeterince geçersiz kılmak bana yardımcı oluyor. Teşekkür ederim!
Fedir Tsapana

121

İşte sınıfım InstantAutoComplete . Bu arasında bir şey var AutoCompleteTextViewve 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);
        }
    }

}

Bunu xml'nizde şu şekilde kullanın:

<your.namespace.InstantAutoComplete ... />

12
Bu harika! Ayrıca, düzen XML dosyanızda değiştirmeniz <AutoCompleteTextView ... />gerektiğini de belirtmek isterim <your.namespace.InstantAutoComplete ... />. Bunu çözmek için biraz zaman kaybettim :)
Jules Colle

3
Harika sınıf - onFocusChanged yönteminde yalnızca öneri olabilir, "if (odaklanmış)" seçeneğini "if (odaklanmış && getAdapter ()! = Null)" olarak değiştirin.
Jacob Tabak

İçin AndroidX , genişletmek androidx.appcompat.widget.AppCompatAutoCompleteTextView.
Mahmudul Hasan Shohag

Bu, yön değişikliklerinde açılır listeyi göstermez.
Miha_x64

45

En kolay yol:

SetOnTouchListener ve showDropDown () komutlarını kullanın.

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

Bunu daha da iyi hale getirmek için if (! Text.isPopupShowing ()) {text.showDropDown (); }
Boldijar Paul

7
çok yaygın değildir, ancak kullanıcının bu EditText'e gitmek için dokunmaması durumunda bu işe yaramaz. Örneğin, düğmeli bir uzaktan kumanda kullanırken (örneğin Android TV).
android geliştiricisi

2
SetOnFocusChanged kullanmalısınız. Birisi klavyeye sahip olabilir ve SEKME düğmesine basabilir veya fareyi kullanarak ve dokunma dinleyicisi çağrılmaz.
barwnikk

onTouchListener tek bir dokunuş için farklı zamanlarda çağrılır - Örn: olay MotionEvent.ACTION_DOWN, MotionEvent.ACTION_UP olabilir. Bu nedenle, belirli bir olayı kontrol etmek ve kodu yazmak daha iyidir
Govind

18

Destil'in kodu, yalnızca bir InstantAutoCompletenesne olduğunda harika çalışır . Yine de iki ile işe yaramadı - neden olduğu hakkında hiçbir fikrim yok. Ama showDropDown()(aynen CommonsWare'in önerdiği gibi) şuna koyduğumda onFocusChanged():

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

sorunu çözdü.

Bu sadece iki yanıtın doğru bir şekilde birleştirilmesidir, ancak umarım birine biraz zaman kazandırır.


2
Eklemeniz yardımcı oldu, ancak InstantAutoComplete'de metin varsa ve ekran yönü değiştiyse bir hata aldım. Pencerenin görünürlüğünü kontrol ederek düzelttim, yeni kodu buraya gönderdim: gist.github.com/furycomptuers/4961368
FuryComputers

9

Adaptör başlangıçta filtreleme yapmaz.
Filtreleme yapılmadığında açılır liste boştur.
bu nedenle, başlangıçta filtrelemeyi başlatmanız gerekebilir.

Bunu yapmak için, filter()girişleri eklemeyi bitirdikten sonra çağırabilirsiniz :

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

6

OnFocusChangeListener'ı kullanabilirsiniz;

TCKimlikNo.setOnFocusChangeListener(new OnFocusChangeListener() {

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

            }

        }
    });

6

Destil'in yukarıdaki cevabı neredeyse işe yarıyor, ancak ince bir hataya sahip. Kullanıcı alana ilk odaklandığında çalışır, ancak ayrılırsa ve sonra alana geri dönerse, açılır menüyü göstermez çünkü mPopupCanBeUpdated'ın değeri, gizlendiği andan itibaren hala yanlış olacaktır. Düzeltme, onFocusChanged yöntemini şu şekilde değiştirmektir:

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

ancak bu aynı zamanda metnin sıfırlanacağı anlamına gelir (ancak bu genellikle sorun değildir) ...
android geliştiricisi

3

CustomAutoCompleteTextView yapmak için. 1. setThreshold, enoughToFilter, onFocusChanged yöntemini geçersiz kılma

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

dene

    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

Bu yöntemi dokunarak veya autoCompleteTextView olayını veya istediğiniz yere tıklamanız yeterlidir.

autoCompleteTextView.showDropDown()

0

Bu benim için çalıştı, sözde kod:

    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

Bunu Java'daki onCreate Yönteminize yapıştırmanız yeterlidir

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

        }
    });

Ve bu da Xml dosyanıza ...

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

Değerler altında string.xml'de bir Dizi oluşturun ...

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

Ve gitmekte iyisin.


0

Yedi yıl sonra çocuklar, sorun aynı kalıyor. İşte o aptal pop-up'ı her koşulda kendini göstermeye zorlayan bir işleve sahip bir sınıf. Tek yapmanız gereken, AutoCompleteTextView için bir adaptör ayarlamak, içine biraz veri eklemek ve istediğiniz showDropdownNow()zaman işlevi çağırmaktır .

@ David Vávra için krediler. Onun koduna dayanıyor.

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

FocusChangeListener üzerinde kontrol edin

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

filtrenizde şu değeri kırpmanız yeterlidir:

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

ve bu görüşe odaklandığınızda tüm önerileri gösterecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.