首页 文章

Android:AutoCompleteTextView在没有输入文本时显示建议

提问于
浏览
105

我正在使用 AutoCompleteTextView ,当用户点击它时,我想显示建议,即使它没有文本 - 但 setThreshold(0) 的工作方式与 setThreshold(1) 完全相同 - 因此用户必须输入至少1个字符才能显示建议 .

13 回答

  • 0

    当只有一个 InstantAutoComplete 对象时,Destil的代码效果很好 . It didn't work with two though - 不知道为什么 . 但是当我将 showDropDown() (就像CommonsWare建议的那样)放入 onFocusChanged() 时,就像这样:

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

    它解决了这个问题 .

    只是两个答案恰当地结合在一起,但我希望它可以节省一些时间 .

  • 3

    这是我的 class InstantAutoComplete . 它是 AutoCompleteTextViewSpinner 之间的东西 .

    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 ... />
    
  • 15

    这对我有用,伪代码:

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

  • 6

    适配器最初不执行过滤 .
    未执行过滤时,下拉列表为空 .
    所以你可能必须先进行过滤 .

    为此,您可以在添加完条目后调用 filter()

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

    你可以使用onFocusChangeListener;

    TCKimlikNo.setOnFocusChangeListener(new OnFocusChangeListener() {
    
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    TCKimlikNo.showDropDown();
    
                }
    
            }
        });
    
  • 0

    这是documented behavior

    当阈值小于或等于0时,应用阈值1 .

    您可以通过 showDropDown() 手动显示下拉菜单,因此您可以安排在需要时显示该下拉菜单 . 或者,子类 AutoCompleteTextView 并覆盖 enoughToFilter() ,一直返回 true .

  • 1

    最简单的方法:

    只需使用setOnTouchListener和showDropDown()

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

    只需将其粘贴到Java中的onCreate方法即可

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

    并在Values ...下的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>
    

    你很高兴 .

  • 2

    只需在触摸时调用此方法或单击autoCompleteTextView的事件或您想要的位置 .

    autoCompleteTextView.showDropDown()
    
  • 5

    试试吧

    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;
                }
            }):
    
  • 133

    七年后,伙计们,问题保持不变 . 这是一个带有函数的类,它强制愚蠢的弹出窗口在任何条件下显示出来 . 您需要做的就是将适配器设置为AutoCompleteTextView,向其中添加一些数据,并随时调用 showDropdownNow() 函数 .

    @DavidVá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)
            }
        }
    }
    
  • 104

    上面的Destil的答案几乎可行,但有一个微妙的错误 . 当用户首先将焦点放在字段上时它会工作,但是如果它们离开然后返回到字段,它将不会显示下拉,因为mPopupCanBeUpdated的值在隐藏时仍然是false . 修复方法是将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("");
            }
        }
    }
    
  • 1

    制作CustomAutoCompleteTextView . 1.覆盖setThreshold,enoughToFilter,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; 
        } 
    }
    

相关问题