Android: AutoCompleteTextView показывает предложения, когда текст не введен - PullRequest
116 голосов
/ 24 января 2010

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

Ответы [ 13 ]

141 голосов
/ 24 января 2010

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

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

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

113 голосов
/ 26 апреля 2011

Вот мой класс 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 ... />
45 голосов
/ 24 января 2013

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

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

AutoCompleteTextView text;
.....
.....
text.setOnTouchListener(new View.OnTouchListener(){
   @Override
   public boolean onTouch(View v, MotionEvent event){
      text.showDropDown();
      return false;
   }
});
16 голосов
/ 04 июля 2012

Код 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();
    }
}

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

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

8 голосов
/ 09 сентября 2014

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

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

adapter.add("a1");
adapter.add("a2");
adapter.add("a3");
adapter.getFilter().filter(null);
6 голосов
/ 22 мая 2013

Ответ Дестила выше почти работает, но имеет одну тонкую ошибку. Когда пользователь впервые фокусируется на поле, оно работает, однако, если они уходят, а затем возвращаются в поле, он не будет отображать раскрывающийся список, поскольку значение 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("");
        }
    }
}
5 голосов
/ 22 января 2013

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

TCKimlikNo.setOnFocusChangeListener(new OnFocusChangeListener() {

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

            }

        }
    });
3 голосов
/ 29 марта 2012

Сделать CustomAutoCompleteTextView. 1. переопределить setThreshold, tooToFilter, метод 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; 
    } 
}
2 голосов
/ 11 апреля 2017

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

autoCompleteTextView.showDropDown()
2 голосов
/ 15 ноября 2015

попробуйте

    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;
            }
        }):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...