5-3-1 Spinner
Spinner 是一个非常类似下拉列表框(dropdown list)的 UI 组件,其优点是节省显示空间,因 为用户尚未单击时,仅显示一条数据。如同其他 UI 组件,一般建议通过 layout 文件建立 Spinner 组件。使用 layout 文件(可参考 SpinnerEx/res/layout/main.xml)建立 Spinner 组件以及选项被单击 后的事件处理步骤如下:
建立 Spinner 选项:在文本文件内建立字符串数组 3 (请参考 SpinnerEx/res/values/
strings.xml),而数组内容即为 Spinner 选项。
<stringarray name="food_array">
<item>蚵仔面线</item>
<item>臭豆腐</item>
<item>葱油饼</item>
</stringarray>
建立 Spinner 组件:使用 <Spinner> 标签。
设置 Spinner 的提示文字: 利用 android:prompt 属性设置提示文字 , 例如“android:prompt="
爱吃什么?"”会显示如图 511 的提示文字。
设置 Spinner 选项:利用 android:entries 属性设置选项。例如 android:entries="@array/
food_array",而 array/food_array 就是 Step 1 建立好的字符串数组。
取得 Spinner 组件后调用 setOnItemSelectedListener() 向 OnItemSelectedListener 监听器注 册,并实现 onItemSelected() 以响应选项改变的情况:
spFood = (Spinner)findViewById(R.id.spFood);
spFood.setOnItemSelectedListener(listener);
3 也可以在程序代码内使用数组或 List 集合建立选项,例如:String[] foods = {"蚵仔面线", "臭豆腐", "葱油饼"};,然后使 用 ArrayAdapter 来获取内容。
Spinner.OnItemSelectedListener listener = new Spinner.OnItemSelectedListener(){
@Override
public void onItemSelected(AdapterView parent, View view, int pos, long id) {
//ItemSelected }
@Override
public void onNothingSelected(AdapterView parent) { //NothingSelected
} };
图 511
建立 Spinner 组件所需使用到的方法说明如表 53 所示:
▼ 表 53 AdapterView 类 4
public void setOnItemSelectedListener (AdapterView.OnItemSelectedListener listener) 向 OnItemSelectedListener 监听器注册,要求监听选项是否被选取。
l listener:实现 OnItemSelectedListener 接口的对象。
4 Spinner 继承 AbsSpinner;AbsSpinner 继承 AdapterView。
续表 AdapterView.OnItemSelectedListener 界面
public abstract void onItemSelected (AdapterView<?> parent, View view, int position, long id) 当选项被选取时会自动调用此方法。
l parent:发生选项被单击的 UI 组件,这里是指 Spinner 组件。
l view:在 AdapterView 中被单击的组件,通常是 TextView 组件。
l position:选项的 index。
l id:选项的 row ID。
public abstract void onNothingSelected (AdapterView<?> parent) 当选项消失时会自动调用此方法。
l parent:发生选项消失的 UI 组件,这里是指 Spinner 组件。
ArrayAdapter 类 5 建构式 public ArrayAdapter (Context context, int textViewResourceId, T[] objects)
建立 ArrayAdapter 组件。ArrayAdapter 组件主要用来管理整个选项的内容与样式。
l context:通常是现行 Activity 对象。
l textViewResourceId:选项的样式主要是以 TextView 组件组成,所以可以在 layout 文件内建立好 TextView 组件的样 式,然后通过资源 ID 套用在选项上。如果不想自行建立选项样式,也可以直接套用 Android 系统内建的样式:
android.R.layout.simple_spinner_item。
l objects:选项的内容。
ArrayAdapter 类 方法 public void setDropDownViewResource (int resource)
设置整个下拉列表的样式。
l resource:通过资源 ID 套用欲呈现的下拉列表样式。可以直接套用 Android 系统内建的样式:android.R.layout.simple_
spinner_dropdown_item。
AbsSpinner 类 public void setAdapter (SpinnerAdapter adapter)
将设置好的选项内容与样式套用在 Spinner 组件上。
l adapter:可以套用上述 ArrayAdapter 对象,也就是选项的内容与样式。
范例 SpinnerEx 范例说明:
l 单击任何一个 Spinner 组件都会将被选取的选项文字以 Toast 消息框显示出来。
5 ArrayAdapter 继承 SpinnerAdapter。
图 512
SpinnerEx/src/org/spinnerEx/SpinnerEx.java
22. private void findViews() {
23. spFood = (Spinner)findViewById(R.id.spFood);
24. spFood.setOnItemSelectedListener(listener);
25.
26. spPlace = (Spinner)findViewById(R.id.spPlace);
27. String[] places = {"Australia", "U.K.", "Japan", "Thailand"};
28. ArrayAdapter<String> adapterPlace = 29. new ArrayAdapter<String>(this,
30. android.R.layout.simple_spinner_item, places);
31. adapterPlace.setDropDownViewResource(
32. android.R.layout.simple_spinner_dropdown_item);
33. spPlace.setAdapter(adapterPlace);
34. spPlace.setOnItemSelectedListener(listener);
35. } 36.
37. Spinner.OnItemSelectedListener listener = 38. new Spinner.OnItemSelectedListener(){
39. @Override
40. public void onItemSelected(AdapterView parent, 41. View view, int pos, long id) {
42. Toast.makeText(parent.getContext(),
43. parent.getItemAtPosition(pos).toString(), 44. Toast.LENGTH_SHORT).show();
45. } 46.
47. @Override
48. public void onNothingSelected(AdapterView parent) { 49. Toast.makeText(parent.getContext(),
50. "Nothing Selected!", 51. Toast.LENGTH_SHORT).show();
52. } 53. };
24、34、3753 行:Spinner 组件调用 setOnItemSelectedListener() 向 OnItemSelectedListener 注 册 , OnItemSelectedListener 专 门 监听 选项 是否 被 选取 。 接下 来 37 行利 用匿 名 内部 类实 现 OnItemSelectedListener 的 onItemSelected()、onNothingSelected() 等 2 个方法。当选项被选取时,
onItemSelected() 会自动被调用,而被选取的选项文字将以 Toast 消息框显示出来。
2730 行:调用 ArrayAdapter 构造方法以建立选项的内容与样式。选项的内容来自于 27 行的 places 字符串数组;样式则套用系统内置布局:android.R.layout.simple_spinner_item。
3132 行:调用 setDropDownViewResource() 套用系统内置的下拉列表样式:android.R.layout.
simple_spinner_dropdown_item。
33 行:Spinner 组件调用 setAdapter()套用指定的 ArrayAdapter 以加载对应的选项内容与样式。
5-3-2 AutoCompleteTextView
AutoCompleteTextView 非 常 类 似 EditText , 都 是 方 便 用 户 输 入 的 组 件 。 不 过 AutoCompleteTextView 组件另外提供提示文字列表, 当用户输入的局部文字符合提示文字时,
应用程序就会自动列出符合的提示文字列表, 让用户可以直接选择想输入的文字而不必将全部文字 输入完毕,是一种方便使用者输入的设计。
AutoCompleteTextView 组件的提示列表与 Spinner 组件的选项建立方式相同,都是在文本文件 内建立字符串数组来储存欲提示的文字。
范例 AutoCompleteEx
图 513
范例说明:
l 输入“a” ,应用程序会作比对,并自动将符合的提示文字以列表方式呈现,方便使用者以 选择方式输入。
AutoCompleteEx/res/layout/main.xml
13. <AutoCompleteTextView android:id="@+id/acCountry"
14. android:layout_width="match_parent"
15. android:layout_height="wrap_content"
16. android:layout_marginLeft="5dp"
17. android:completionThreshold="1" />
13 行:定义 AutoCompleteTextView 组件。
17 行:设置至少要输入 1 个字符才会显示提示文字。如果未设置则默认为 2 个字符。
AutoCompleteEx/src/org/autoCompleteEx/AutoCompleteEx.java
18. private void findViews() {
19. acCountry = (AutoCompleteTextView)findViewById(R.id.acCountry);
20. String[] countries =
21. getResources().getStringArray(R.array.countries_array);
22. ArrayAdapter<String> adapterCountry =
23. new ArrayAdapter<String>(this, R.layout.list_item, countries);
24. acCountry.setAdapter(adapterCountry);
25. }
21 行:调用 Context 的 getResources() 会取得 Resources 对象,再调用 getStringArray() 会取得 字符串数组,其内容将用来作为 AutoCompleteTextView 组件的提示文字。R.array.countries_array 代 表定义在文本文件内,名为 countries_array 的字符串数组。
23 行: R.layout.list_item 代表提示文字将套用 “list_item” layout 文件所定义的样式。 ArrayAdapter 已在 Spinner 一节说明,不再赘述。