web-dev-qa-db-fra.com

android comment un EditText fonctionne comme une saisie semi-automatique

Je veux que ma EditText devrait fonctionner comme AutoComplete, pour cela j'écris dans un fichier XML

Android:inputType="textAutoComplete|textAutoCorrect"

mais ça ne marche pas. 

Je travaille avec API v2.2 et mon activité s'étend MapActivity, là je mets une simple EditText et un bouton nommé "Rechercher". Donc, si nous tapons le nom de l'emplacement dans EditText et que nous appuyons sur le bouton de recherche, il devrait aller à cet emplacement sur la carte . Je veux donc que EditText fonctionne comme une AutoComplete. Comment puis-je le faire?

32
Jyosna

Utilisez simplement une AutoCompleteTextView au lieu de la normale EditText.

hello-autocomplete sera utile.

45
Arnab Chakraborty

Convertissez d'abord votre EditText->AutoCompleteTextView

Ensuite, liez votre fichier XML à la AutoCompleteTextView en utilisant une ArrayAdapter

Supposons que le string-array XML que vous avez créé porte le nom list_of_countries, puis il peut être lié à votre AutoCompleteTextView comme suit:

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);
14
Bestin John

J'utilise ce code:

 enter image description here

1) Sur AndroidManifest.xml

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

2) Sur la mise en page XML, vous devez utiliser AutoCompleteTextView au lieu de EditText.

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

3) Utilisez ceci sur le fichier d'activité

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) Sur l'activité onCreate:

AutoCompleteTextView autoCompleteTextView1 = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1);
autoCompleteTextView1.setAdapter(getEmailAddressAdapter(this));
9
mghhgm

La valeur par défaut ArrayAdapter ne filtre que par les premiers caractères. Si vous souhaitez également voir les mots qui contiennent le mot-clé recherché, vous devez utiliser un ArrayAdapter personnalisé et substituer ses méthodes getView et getFilter. Jetez un coup d’œil à une solution complète que j’ai fournie dans une autre question de StackOverflow: https://stackoverflow.com/a/37298258/1808829

2
Sa Qada

Ce code pour modifier les paramètres de 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());

Et au-dessous de ce code permettant de scinder les mots par space char et \n charactes .. (Pourquoi avons-nous besoin de ce code? Parce que multiAutoComplete.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); normal ressemble à cela et que le scission des mots par ',' caractère, mais notre code vous aide à faire cette division par ces caractères '' et '\ 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
Kamran Qasimov