创建一个能自动补全提示的文本输入控件(widget),可以使用AutoCompleteTextView控件。提示从与控件关联的ArrayAdapter提供的字符串集合得到。
在这个教程中,你将要创建一个自动提示国家名字的AutoCompleteTextView。
启动一个新项目并命名为HelloAutoComplete。
创建一个名为list_item.xml的XML文件并把它保存在res/layout/文件夹下。编辑文件像下面这样:
[html]
- <?xml version="1.0" encoding="utf-8"?>
- <TextView xmlns:Android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:padding="10dp"
- android:textSize="16sp"
- android:textColor="#000">
- </TextView>
这个文件定义了一个简单的TextView来显示提示列表的每一项。
打开 res/layout/main.xml文件加入如下内容:
[html]
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:padding="5dp">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Country" />
- <AutoCompleteTextView android:id="@+id/autocomplete_country"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="5dp"/>
- </LinearLayout>
这个TextView是一个介绍AutoCompleteTextView控件的标签。
打开HelloAutoComplete.java并在onCreate()函数中添加如下代码:
[java]
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autocomplete_country);
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, COUNTRIES);
- textView.setAdapter(adapter);
- }
把main.xml布局设置为内容视图后,AutoCompleteTextView控件就会在布局中用findViewById(int)找到。接下来,一个新的ArrayAdapter初始化并把
COUNTRIES字符串数组(在下一步定义)的每个列表项绑定到 list_item.xml布局。最后,调用setAdapter()将AutoCompleteTextView和ArrayAdapter关联起来,这样字符串数组就能填充到提示列表中。
在HelloAutoComplete类中加入字符串数组:
[java]
- static final String[] COUNTRIES = new String[] {
- "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra",
- "Angola", "Anguilla", "Antarctica", "Antigua and Barbuda", "Argentina",
- "Armenia", "Aruba", "Australia", "Austria", "Azerbaijan",
- "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium",
- "Belize", "Benin", "Bermuda", "Bhutan", "Bolivia",
- "Bosnia and Herzegovina", "Botswana", "Bouvet Island", "Brazil", "British Indian Ocean Territory",
- "British Virgin Islands", "Brunei", "Bulgaria", "Burkina Faso", "Burundi",
- "Cote d'Ivoire", "Cambodia", "Cameroon", "Canada", "Cape Verde",
- "Cayman Islands", "Central African Republic", "Chad", "Chile", "China",
- "Christmas Island", "Cocos (Keeling) Islands", "Colombia", "Comoros", "Congo",
- "Cook Islands", "Costa Rica", "Croatia", "Cuba", "Cyprus", "Czech Republic",
- "Democratic Republic of the Congo", "Denmark", "Djibouti", "Dominica", "Dominican Republic",
- "East Timor", "Ecuador", "Egypt", "El Salvador", "Equatorial Guinea", "Eritrea",
- "Estonia", "Ethiopia", "Faeroe Islands", "Falkland Islands", "Fiji", "Finland",
- "Former Yugoslav Republic of Macedonia", "France", "French Guiana", "French Polynesia",
- "French Southern Territories", "Gabon", "Georgia", "Germany", "Ghana", "Gibraltar",
- "Greece", "Greenland", "Grenada", "Guadeloupe", "Guam", "Guatemala", "Guinea", "Guinea-Bissau",
- "Guyana", "Haiti", "Heard Island and McDonald Islands", "Honduras", "Hong Kong", "Hungary",
- "Iceland", "India", "Indonesia", "Iran", "Iraq", "Ireland", "Israel", "Italy", "Jamaica",
- "Japan", "Jordan", "Kazakhstan", "Kenya", "Kiribati", "Kuwait", "Kyrgyzstan", "Laos",
- "Latvia", "Lebanon", "Lesotho", "Liberia", "Libya", "Liechtenstein", "Lithuania", "Luxembourg",
- "Macau", "Madagascar", "Malawi", "Malaysia", "Maldives", "Mali", "Malta", "Marshall Islands",
- "Martinique", "Mauritania", "Mauritius", "Mayotte", "Mexico", "Micronesia", "Moldova",
- "Monaco", "Mongolia", "Montserrat", "Morocco", "Mozambique", "Myanmar", "Namibia",
- "Nauru", "Nepal", "Netherlands", "Netherlands Antilles", "New Caledonia", "New Zealand",
- "Nicaragua", "Niger", "Nigeria", "Niue", "Norfolk Island", "North Korea", "Northern Marianas",
- "Norway", "Oman", "Pakistan", "Palau", "Panama", "Papua New Guinea", "Paraguay", "Peru",
- "Philippines", "Pitcairn Islands", "Poland", "Portugal", "Puerto Rico", "Qatar",
- "Reunion", "Romania", "Russia", "Rwanda", "Sqo Tome and Principe", "Saint Helena",
- "Saint Kitts and Nevis", "Saint Lucia", "Saint Pierre and Miquelon",
- "Saint Vincent and the Grenadines", "Samoa", "San Marino", "Saudi Arabia", "Senegal",
- "Seychelles", "Sierra Leone", "Singapore", "Slovakia", "Slovenia", "Solomon Islands",
- "Somalia", "South Africa", "South Georgia and the South Sandwich Islands", "South Korea",
- "Spain", "Sri Lanka", "Sudan", "Suriname", "Svalbard and Jan Mayen", "Swaziland", "Sweden",
- "Switzerland", "Syria", "Taiwan", "Tajikistan", "Tanzania", "Thailand", "The Bahamas",
- "The Gambia", "Togo", "Tokelau", "Tonga", "Trinidad and Tobago", "Tunisia", "Turkey",
- "Turkmenistan", "Turks and Caicos Islands", "Tuvalu", "Virgin Islands", "Uganda",
- "Ukraine", "United Arab Emirates", "United Kingdom",
- "United States", "United States Minor Outlying Islands", "Uruguay", "Uzbekistan",
- "Vanuatu", "Vatican City", "Venezuela", "Vietnam", "Wallis and Futuna", "Western Sahara",
- "Yemen", "Yugoslavia", "Zambia", "Zimbabwe"
- };
这就是当用户在AutoCompleteTextView控件输入时提供给下拉列表的提示。
启动这个应用程序。
当你输入时,你将会看到如下:
更多信息
需要注意的是设计实践中不建议硬编码(hard-coded)字符串数组,因为你的应用程序将关注于行为,而不是内容。应用程序的内容如字符串会写在代码外部这样做修改时就更方便和容易。这个教程中硬编码的字符串只是做个例子重点放在了AutoCompleteTextView控件上。相反的,你的应用程序可以声明这样的字符串数组在XML文件中。这可以在你的项目中res/values/strings.xml 文件里用<string-array>资源来完成。请看下面示例:
[html]
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string-array name="countries_array">
- <item>Bahrain</item>
- <item>Bangladesh</item>
- <item>Barbados</item>
- <item>Belarus</item>
- <item>Belgium</item>
- <item>Belize</item>
- <item>Benin</item>
- </string-array>
- </resources>
在ArrayAdapter使用这个资源字符串,只需要替换原来的ArrayAdapter构造部分,像下面一样:
[java]
- String[] countries = getResources().getStringArray(R.array.countries_array);
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, countries);