Android: AutoCompleteTextView show suggestions when no text entered

后端 未结 14 1845
-上瘾入骨i
-上瘾入骨i 2020-11-27 11:20

I am using AutoCompleteTextView, when the user clicks on it, I want to show suggestions even if it has no text - but setThreshold(0) works exactly

相关标签:
14条回答
  • 2020-11-27 12:00

    To make CustomAutoCompleteTextView. 1. override setThreshold,enoughToFilter,onFocusChanged method

    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; 
        } 
    }
    
    0 讨论(0)
  • 2020-11-27 12:00

    try it

        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;
                }
            }):
    
    0 讨论(0)
  • 2020-11-27 12:02

    Easiest way:

    Just use setOnTouchListener and showDropDown()

    AutoCompleteTextView text;
    .....
    .....
    text.setOnTouchListener(new View.OnTouchListener(){
       @Override
       public boolean onTouch(View v, MotionEvent event){
          text.showDropDown();
          return false;
       }
    });
    
    0 讨论(0)
  • 2020-11-27 12:02

    You can use onFocusChangeListener;

    TCKimlikNo.setOnFocusChangeListener(new OnFocusChangeListener() {
    
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    TCKimlikNo.showDropDown();
    
                }
    
            }
        });
    
    0 讨论(0)
  • 2020-11-27 12:04

    This is documented behavior:

    When threshold is less than or equals 0, a threshold of 1 is applied.

    You can manually show the drop-down via showDropDown(), so perhaps you can arrange to show it when you want. Or, subclass AutoCompleteTextView and override enoughToFilter(), returning true all of time.

    0 讨论(0)
  • 2020-11-27 12:07

    Seven years later, guys, the problem stays the same. Here's a class with a function which forces that stupid pop-up to show itself in any conditions. All you need to do is to set an adapter to your AutoCompleteTextView, add some data into it, and call showDropdownNow() function anytime.

    Credits to @David Vávra. It's based on his 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)
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题