android如何将一个EditText工作为AutoComplete

我想我的EditText应该作为AutoComplete ,因为我写在XML文件

 android:inputType="textAutoComplete|textAutoCorrect" 

但它不工作。

我正在使用API​​ v2.2,并且我的活动扩展了MapActivity ,在那里我放了一个简单的EditText和一个名为“Search”的button。 所以如果我们在EditText键入位置名称,并按下searchbutton意味着它应该去地图中的位置。 所以我希望EditText应该作为AutoComplete 。 我怎样才能做到这一点? 谢谢

Solutions Collecting From Web of "android如何将一个EditText工作为AutoComplete"

只需使用AutoCompleteTextView而不是普通的EditText

你好,自动完成会有帮助。

首先转换你的EditText-> AutoCompleteTextView。

然后使用ArrayAdapter将您的XML文件链接到AutoCompleteTextView。

假定您创build的XMLstring数组被命名为list_of_countries,那么它可以链接到您的AutoCompleteTextView,如下所示:

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

我使用这个代码:

在这里输入图像说明

1)在AndroidManifest.xml

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

2)在xml布局上,您必须使用AutoCompleteTextView而不是EditText。

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

3)在Activity文件中使用这个

 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)OnCreate活动:

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

默认ArrayAdapter只能过滤第一个字符。 如果您还想查看包含search关键字的单词,则需要使用自定义ArrayAdapter并覆盖其getViewgetFilter方法。 看看我在另一个StackOverflow问题中提供的完整解决scheme: https ://stackoverflow.com/a/372​​98258/1808829

这个代码用于更改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()); 

并在下面的代码,以空间字符\ n字符multiAutoComplete.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());字(为什么我们需要这个代码?因为正常multiAutoComplete.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());这样,它使分裂的单词','字符,但是我们的代码可以帮助你通过这些字符''和'\ 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 + " "; } } }