android how an EditText work as AutoComplete

前端 未结 5 1586
孤独总比滥情好
孤独总比滥情好 2020-12-03 02:38

I want my EditText should work as AutoComplete, for that I write in XML file

android:inputType=\"textAutoComplete|textAutoCorrect\"         


        
相关标签:
5条回答
  • 2020-12-03 02:57

    Default ArrayAdapter filters only by the first characters. In case you want to see also words which contain the searching keyword, you need to use a custom ArrayAdapter and override its getView and getFilter methods. Take a look at a complete solution I provided in another StackOverflow question: https://stackoverflow.com/a/37298258/1808829

    Some code fragment:

    public class AutoSuggestAdapter extends ArrayAdapter
    {
        @Override
        public View getView(int position, View convertView, ViewGroup parent)
        {
            // handle view here
        }
    
        @Override
        public Filter getFilter()
        {
           // implement filtering here
        }
    }
    
    0 讨论(0)
  • 2020-12-03 03:03

    I use this code:

    1) On AndroidManifest.xml

    <uses-permission android:name="android.permission.GET_ACCOUNTS"></uses-permission>
    

    2) On xml layout you must use AutoCompleteTextView instead of EditText.

    <AutoCompleteTextView
        android:id="@+id/autoCompleteTextView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:text="AutoCompleteTextView" />
    

    3) Use this on Activity file

    private ArrayAdapter<String> getEmailAddressAdapter(Context context) {
        Account[] accounts = AccountManager.get(context).getAccounts();
        String[] addresses = new String[accounts.length];
        for (int i = 0; i < accounts.length; i++) { 
            addresses[i] = accounts[i].name;
        }
        return new ArrayAdapter<String>(context, android.R.layout.simple_dropdown_item_1line, addresses);
    }
    

    4) On onCreate activity:

    AutoCompleteTextView autoCompleteTextView1 = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1);
    autoCompleteTextView1.setAdapter(getEmailAddressAdapter(this));
    
    0 讨论(0)
  • 2020-12-03 03:12

    First convert your EditText->AutoCompleteTextView

    Then link your XML file to the AutoCompleteTextView using a ArrayAdapter

    Assume that the XML string-array you created is named as list_of_countries then it can be linked to your AutoCompleteTextView as follows:

    String[] countries = getResources().getStringArray(R.array.list_of_countries);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,countries);
    actv.setAdapter(adapter);
    
    0 讨论(0)
  • 2020-12-03 03:20

    Just use an AutoCompleteTextView instead of normal EditText.

    hello-autocomplete will be helpful.

    EDIT: The above link looks like has expired. The new page is here: https://developer.android.com/training/keyboard-input/style#AutoComplete

    0 讨论(0)
  • 2020-12-03 03:21

    This code for change settings of MultiAutoCompleteTextView

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,codeKeyWords);
    MultiAutoCompleteTextView autoCompleteTextView1 = (MultiAutoCompleteTextView) findViewById(R.id.autoCompleteTextView1);
    autoCompleteTextView1.setAdapter(adapter);
    autoCompleteTextView1.setThreshold(1);
    autoCompleteTextView1.setTokenizer(new this.CommaTokenizer());
    

    And below that code for make spliting words by space char and \n charactes.. (Why we need this code? Because Normal multiAutoComplete.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); like that and it make spliting the words by ',' character, But our code help you to make that spliting by these characters ' ' and '\n' )

    /**
             * This simple Tokenizer can be used for lists where the items are
             * separated by a comma and one or more spaces.
             */
        public static class CommaTokenizer implements Tokenizer {
            public int findTokenStart(CharSequence text, int cursor) {
                int i = cursor;
    
                while (i > 0 && text.charAt(i - 1) != ' ') {
                    i--;
                }
                while (i < cursor && text.charAt(i) == '\n') {
                    i++;
                }
    
                return i;
            }
    
            public int findTokenEnd(CharSequence text, int cursor) {
                int i = cursor;
                int len = text.length();
    
                while (i < len) {
                    if (text.charAt(i) == '\n') {
                        return i;
                    } else {
                        i++;
                    }
                }
    
                return len;
            }
    
            public CharSequence terminateToken(CharSequence text) {
                int i = text.length();
    
                while (i > 0 && text.charAt(i - 1) == ' ') {
                    i--;
                }
    
                if (i > 0 && text.charAt(i - 1) == ' ') {
                    return text;
                } else {
                    if (text instanceof Spanned) {
                        SpannableString sp = new SpannableString(text + "\n");
                        TextUtils.copySpansFrom((Spanned) text, 0, text.length(),
                                                Object.class, sp, 0);
                        return sp;
                    } else {
                        return text + " ";
                    }
                }
            }
    
    0 讨论(0)
提交回复
热议问题