Android: AutoCompleteTextView показывает предложения, когда текст не введен

Я использую AutoCompleteTextView, когда пользователь нажимает на него, я хочу отображать предложения, даже если в нем нет текста, но setThreshold(0) работает точно так же, как setThreshold(1), поэтому пользователь должен ввести хотя бы 1 символ, чтобы отобразить предложения.


person fhucho    schedule 24.01.2010    source источник
comment
Я делаю нечто похожее ЗДЕСЬ !!! stackoverflow.com/questions/12854336/   -  person toobsco42    schedule 30.10.2012


Ответы (14)


Это задокументированное поведение:

Когда threshold меньше или равно 0, применяется порог 1.

Вы можете вручную отобразить раскрывающийся список с помощью showDropDown(), так что, возможно, вы можете настроить отображение его, когда захотите. Или создайте подкласс AutoCompleteTextView и переопределите enoughToFilter(), все время возвращая true.

person CommonsWare    schedule 24.01.2010
comment
ShowDropDown (), похоже, хорошо работает при настройке onClickListener, но подкласс не работает, пока пользователь не введет букву и не вернет dels. Но не только с onClick ... - person amj; 20.02.2013
comment
Это прекрасно работает в сочетании с OnFocusChangeListener, который вызывает showDropDown (), когда представление получает фокус. - person Grishka; 06.02.2014
comment
Я также должен переопределить onFocusChanged, как указано в ответе ниже @David Vávra - person Gabriel; 02.02.2017
comment
@commonsWare showDropDown() не работает в afterTextChanged, когда .getText().toString().length()==0. ПОЧЕМУ - person Prabs; 26.04.2017
comment
Мне помогает только переопределение достаточноToFilter. Спасибо! - person Fedir Tsapana; 21.09.2018
comment
работает как шарм. используйте setOnFocusChangeListener, затем вызовите showDropDown () в AutocompleteTextView. - person M Umer; 02.11.2019

Вот мой класс InstantAutoComplete. Это что-то среднее между AutoCompleteTextView и 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);
        }
    }

}

Используйте его в своем xml вот так:

<your.namespace.InstantAutoComplete ... />
person David Vávra    schedule 25.04.2011
comment
Замечательно! Я также хотел бы отметить, что в XML-файле вашего макета вы должны изменить <AutoCompleteTextView ... /> на <your.namespace.InstantAutoComplete ... />. Я потерял время, разбираясь в этом :) - person Jules Colle; 23.05.2012
comment
Отличный класс - только предложение было бы в методе onFocusChanged, измените if (сфокусированный) на if (сфокусированный && getAdapter ()! = Null). - person Jacob Tabak; 15.12.2013
comment
Для AndroidX расширьте androidx.appcompat.widget.AppCompatAutoCompleteTextView. - person Mahmudul Hasan Shohag; 21.01.2019

Самый простой способ:

Просто используйте setOnTouchListener и showDropDown ()

AutoCompleteTextView text;
.....
.....
text.setOnTouchListener(new View.OnTouchListener(){
   @Override
   public boolean onTouch(View v, MotionEvent event){
      text.showDropDown();
      return false;
   }
});
person user1913469    schedule 24.01.2013
comment
Чтобы сделать это еще лучше, используйте if (! Text.isPopupShowing ()) {text.showDropDown (); } - person Boldijar Paul; 15.12.2014
comment
не очень часто, но это не сработает, если пользователь не коснется, чтобы перейти к этому EditText. Например, при использовании пульта ДУ с кнопками (например, Android TV). - person android developer; 31.12.2014
comment
Вы должны использовать setOnFocusChanged. Кто-то может иметь клавиатуру и нажимать кнопку TAB, иначе прослушиватель с помощью мыши и сенсорного ввода не будет вызван. - person barwnikk; 29.08.2015
comment
onTouchListener будет вызываться разное время для одного нажатия - Пример: событие может быть MotionEvent.ACTION_DOWN, MotionEvent.ACTION_UP. Так что лучше проверить конкретное событие и написать код - person Govind; 30.12.2016

Код Destil отлично работает, когда есть только один InstantAutoComplete объект. Но с двумя не сработало - не знаю почему. Но когда я помещаю showDropDown() (как рекомендовано CommonsWare) в onFocusChanged() вот так:

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

это решило проблему.

Это просто два правильных ответа, но я надеюсь, что это поможет кому-то сэкономить время.

person alex    schedule 04.07.2012
comment
Ваше добавление помогло, но я получал сообщение об ошибке, если в InstantAutoComplete был текст и ориентация экрана изменилась. Я исправил это с помощью проверки видимости окна, я разместил новый код здесь: gist.github.com/ furycomptuers / 4961368 - person FuryComputers; 15.02.2013

Первоначально адаптер не выполняет фильтрацию.
Если фильтрация не выполняется, раскрывающийся список пуст.
поэтому вам, возможно, придется сначала запустить фильтрацию.

Для этого вы можете вызвать filter() после завершения добавления записей:

adapter.add("a1");
adapter.add("a2");
adapter.add("a3");
adapter.getFilter().filter(null);
person david m lee    schedule 08.09.2014

Вы можете использовать onFocusChangeListener;

TCKimlikNo.setOnFocusChangeListener(new OnFocusChangeListener() {

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

            }

        }
    });
person Göksel Güren    schedule 22.01.2013

Ответ Destil выше почти работает, но имеет одну тонкую ошибку. Когда пользователь сначала переключает фокус на поле, оно работает, однако, если они уйдут, а затем вернутся в поле, выпадающий список не будет отображаться, потому что значение mPopupCanBeUpdated по-прежнему будет ложным с того момента, когда оно было скрыто. Исправление состоит в том, чтобы изменить метод onFocusChanged на:

@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("");
        }
    }
}
person Colin Stewart    schedule 21.05.2013
comment
но это также означает, что текст будет сброшен (хотя обычно это нормально) ... - person android developer; 31.12.2014

Чтобы сделать CustomAutoCompleteTextView. 1. переопределить метод setThreshold, достаточноToFilter, 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; 
    } 
}
person sanjeev vishnoi    schedule 29.03.2012

попробуй

    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;
            }
        }):
person Rafayel Pogosyan    schedule 15.11.2015

Просто вызовите этот метод при касании или событии щелчка autoCompleteTextView или где хотите.

autoCompleteTextView.showDropDown()
person Dalvinder Singh    schedule 11.04.2017

Это сработало для меня, псевдокод:

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

person Nasif Md. Tanjim    schedule 05.07.2017

Просто вставьте это в свой метод onCreate в 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();

        }
    });

И это в ваш файл Xml ...

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

И создайте массив в string.xml в разделе Значения ...

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

И вам хорошо идти.

person Lalit Fauzdar    schedule 25.07.2017

Семь лет спустя, ребята, проблема осталась прежней. Вот класс с функцией, которая заставляет это глупое всплывающее окно показывать себя в любых условиях. Все, что вам нужно сделать, это установить адаптер для вашего AutoCompleteTextView, добавить в него данные и в любое время вызвать функцию showDropdownNow().

Кредиты для @David Vávra. Это основано на его коде.

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)
        }
    }
}
person mykolaj    schedule 21.09.2017

на FocusChangeListener проверьте

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

в вашем фильтре просто обрежьте это значение:

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

и он покажет все предложения, когда вы сосредоточитесь на этом представлении.

person beokh    schedule 30.06.2020