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?
Utilisez simplement une AutoCompleteTextView
au lieu de la normale EditText
.
hello-autocomplete sera utile.
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);
J'utilise ce code:
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));
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
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 + " ";
}
}
}