Android: AutoCompleteTextView menampilkan saran saat tidak ada teks yang dimasukkan

127

Saya menggunakan AutoCompleteTextView, ketika pengguna mengkliknya, saya ingin menampilkan saran walaupun tidak memiliki teks - tetapi setThreshold(0)berfungsi sama persis dengan setThreshold(1)- sehingga pengguna harus memasukkan setidaknya 1 karakter untuk menampilkan saran.

fhucho
sumber
Saya sedang melakukan sesuatu yang serupa DI SINI !!! stackoverflow.com/questions/12854336/...
toobsco42

Jawaban:

159

Ini adalah perilaku yang didokumentasikan :

Ketika thresholdkurang dari atau sama dengan 0, ambang 1 diterapkan.

Anda dapat menampilkan drop-down secara manual showDropDown(), jadi mungkin Anda dapat mengatur untuk menunjukkannya saat diinginkan. Atau, subkelas AutoCompleteTextViewdan override enoughToFilter(), mengembalikan truesemua waktu.

CommonsWare
sumber
7
The showDropDown () tampaknya bekerja dengan baik pada pengaturan onClickListener, tetapi hal subclass tidak berfungsi sampai pengguna memasukkan surat dan kembali ke dels. Tapi tidak hanya dengan onClick ...
amj
9
Ini berfungsi hanya dalam kombinasi dengan OnFocusChangeListener yang memanggil showDropDown () ketika tampilan mendapatkan fokus.
Grishka
Saya juga harus mengganti onFocusChanged, seperti yang dinyatakan pada jawaban di bawah ini oleh @ David Vávra
Gabriel
4
@commonsWare showDropDown()tidak berfungsi afterTextChangedsaat .getText().toString().length()==0. MENGAPA
Prab
1
Hanya meng-override cukup ToFilter membantu saya. Terima kasih!
Fedir Tsapana
121

Ini kelas saya InstantAutoComplete . Sesuatu antara AutoCompleteTextViewdan 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);
        }
    }

}

Gunakan di xml Anda seperti ini:

<your.namespace.InstantAutoComplete ... />
David Vávra
sumber
12
Itu hebat! Aku juga ingin menunjukkan bahwa dalam file XML tata letak Anda, Anda harus perubahan <AutoCompleteTextView ... />ke <your.namespace.InstantAutoComplete ... />. Saya kehilangan waktu untuk memikirkan hal ini :)
Jules Colle
3
Saran kelas - satunya yang bagus adalah dalam metode onFocusChanged, ubah "if (terfokus)" menjadi "if (terfokus && getAdapter ()! = Null)".
Jacob Tabak
Untuk AndroidX , perpanjang androidx.appcompat.widget.AppCompatAutoCompleteTextView.
Mahmudul Hasan Shohag
Ini tidak menunjukkan dropdown pada perubahan orientasi.
Miha_x64
45

Cara termudah:

Cukup gunakan setOnTouchListener dan showDropDown ()

AutoCompleteTextView text;
.....
.....
text.setOnTouchListener(new View.OnTouchListener(){
   @Override
   public boolean onTouch(View v, MotionEvent event){
      text.showDropDown();
      return false;
   }
});
pengguna1913469
sumber
Untuk menjadikan ini lebih baik digunakan if (! Text.isPopupShowing ()) {text.showDropDown (); }
Boldijar Paul
7
tidak terlalu umum, tetapi ini tidak akan berfungsi jika pengguna tidak menyentuh untuk pergi ke EditText ini. Misalnya ketika menggunakan remote control dengan tombol (Android TV, misalnya).
pengembang android
2
Anda harus menggunakan setOnFocusChanged. Seseorang dapat memiliki keyboard dan menekan tombol TAB atau menggunakan mouse dan pendengar sentuh tidak akan dipanggil.
barwnikk
onTouchListener akan dipanggil waktu yang berbeda untuk satu ketukan - Mis: acara tersebut dapat berupa MotionEvent.ACTION_DOWN, MotionEvent.ACTION_UP. Jadi lebih baik untuk memeriksa acara tertentu dan menulis kode
Govind
18

Kode Destil bekerja sangat baik ketika hanya ada satu InstantAutoCompleteobjek. Tapi itu tidak bekerja dengan dua - tidak tahu mengapa. Tapi ketika saya memasukkan showDropDown()(seperti yang disarankan CommonsWare) ke onFocusChanged()seperti ini:

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

itu memecahkan masalah.

Hanya dua jawaban yang digabungkan dengan benar, tapi saya harap ini bisa menghemat waktu seseorang.

alex
sumber
2
Tambahan Anda membantu, tetapi saya mendapat kesalahan jika ada teks di InstantAutoComplete dan orientasi layar berubah. Saya memperbaikinya dengan cek pada visibilitas jendela, saya memposting kode baru di sini: gist.github.com/furycomptuers/4961368
FuryComputers
9

Adaptor tidak melakukan penyaringan pada awalnya.
Ketika penyaringan tidak dilakukan, daftar dropdown kosong.
jadi Anda mungkin harus melakukan penyaringan pada awalnya.

Untuk melakukannya, Anda dapat meminta filter()setelah Anda selesai menambahkan entri:

adapter.add("a1");
adapter.add("a2");
adapter.add("a3");
adapter.getFilter().filter(null);
david m lee
sumber
6

Anda dapat menggunakan onFocusChangeListener;

TCKimlikNo.setOnFocusChangeListener(new OnFocusChangeListener() {

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

            }

        }
    });
Göksel Güren
sumber
6

Jawaban Destil di atas hampir berhasil, tetapi memiliki satu bug halus. Ketika pengguna pertama kali memberikan fokus ke bidang itu berfungsi, namun jika mereka pergi dan kemudian kembali ke bidang itu tidak akan menunjukkan drop down karena nilai mPopupCanBeUpdated masih akan salah sejak disembunyikan. Cara mengatasinya adalah mengubah metode onFocusChanged menjadi:

@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
sumber
tetapi ini juga berarti bahwa teks akan diatur ulang (meskipun biasanya cukup ok) ...
pengembang android
3

Untuk membuat CustomAutoCompleteTextView. 1. mengganti setThreshold, enoughToFilter, metode 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
sumber
3

Cobalah

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

Panggil saja metode ini pada sentuhan atau klik acara autoCompleteTextView atau di mana Anda inginkan.

autoCompleteTextView.showDropDown()
Dalvinder Singh
sumber
0

Ini bekerja untuk saya, kode semu:

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

Cukup tempel ini ke Metode onCreate Anda di Jawa

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

        }
    });

Dan ini ke file Xml Anda ...

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

Dan buat Array di string.xml di bawah Nilai ...

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

Dan Anda baik untuk pergi.

Lalit Fauzdar
sumber
0

Tujuh tahun kemudian, teman-teman, masalahnya tetap sama. Ini adalah kelas dengan fungsi yang memaksa pop-up bodoh itu muncul sendiri dalam kondisi apa pun. Yang perlu Anda lakukan adalah mengatur adaptor ke AutoCompleteTextView Anda, menambahkan beberapa data ke dalamnya, dan memanggil showDropdownNow()fungsi kapan saja.

Kredit ke @David Vávra. Itu berdasarkan kodenya.

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

pada FocusChangeListener, periksa

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

di filter Anda, cukup trim nilai ini:

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

dan itu akan menampilkan semua saran saat Anda fokus pada tampilan ini.

beokh
sumber