• 沒有找到結果。

5­3  Spinner 与 AutoCompleteTextView

5-3-1 Spinner 

Spinner 是一个非常类似下拉列表框(drop­down list)的 UI 组件,其优点是节省显示空间,因 为用户尚未单击时,仅显示一条数据。如同其他 UI 组件,一般建议通过 layout 文件建立 Spinner  组件。使用 layout 文件(可参考 SpinnerEx/res/layout/main.xml)建立 Spinner 组件以及选项被单击 后的事件处理步骤如下:

建立  Spinner  选项:在文本文件内建立字符串数组 (请参考  SpinnerEx/res/values/ 

strings.xml),而数组内容即为 Spinner 选项。

<string­array name="food_array"> 

<item>蚵仔面线</item> 

<item>臭豆腐</item> 

<item>葱油饼</item> 

</string­array>

建立 Spinner 组件:使用  <Spinner>  标签。

设置 Spinner 的提示文字: 利用 android:prompt 属性设置提示文字 , 例如“android:prompt=" 

爱吃什么?"”会显示如图 5­11 的提示文字。

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

也可以在程序代码内使用数组或 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 

}  };

图 5­11 

建立 Spinner 组件所需使用到的方法说明如表 5­3 所示:

▼ 表 5­3  AdapterView 类 

public void setOnItemSelectedListener (AdapterView.OnItemSelectedListener listener)  向 OnItemSelectedListener 监听器注册,要求监听选项是否被选取。

listener:实现 OnItemSelectedListener 接口的对象。 

Spinner 继承 AbsSpinner;AbsSpinner 继承 AdapterView。

续表  AdapterView.OnItemSelectedListener 界面 

public abstract void onItemSelected (AdapterView<?> parent, View view, int position, long id)  当选项被选取时会自动调用此方法。

parent:发生选项被单击的 UI 组件,这里是指 Spinner 组件。

view:在 AdapterView 中被单击的组件,通常是 TextView 组件。

position:选项的 index。

id:选项的 row ID。 

public abstract void onNothingSelected (AdapterView<?> parent)  当选项消失时会自动调用此方法。

parent:发生选项消失的 UI 组件,这里是指 Spinner 组件。 

ArrayAdapter 类  建构式  public ArrayAdapter (Context context, int textViewResourceId, T[] objects) 

建立 ArrayAdapter 组件。ArrayAdapter 组件主要用来管理整个选项的内容与样式。

context:通常是现行 Activity 对象。

textViewResourceId:选项的样式主要是以 TextView 组件组成,所以可以在 layout 文件内建立好 TextView 组件的样 式,然后通过资源  ID  套用在选项上。如果不想自行建立选项样式,也可以直接套用  Android  系统内建的样式: 

android.R.layout.simple_spinner_item。

objects:选项的内容。 

ArrayAdapter 类 方法  public void setDropDownViewResource (int resource) 

设置整个下拉列表的样式。

resource:通过资源 ID 套用欲呈现的下拉列表样式。可以直接套用 Android 系统内建的样式:android.R.layout.simple_ 

spinner_dropdown_item。 

AbsSpinner 类  public void setAdapter (SpinnerAdapter adapter) 

将设置好的选项内容与样式套用在 Spinner 组件上。

adapter:可以套用上述 ArrayAdapter 对象,也就是选项的内容与样式。

范例 SpinnerEx  范例说明:

l 单击任何一个 Spinner 组件都会将被选取的选项文字以 Toast 消息框显示出来。 

ArrayAdapter 继承 SpinnerAdapter。

图 5­12 

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、37­53 行:Spinner 组件调用 setOnItemSelectedListener()  向 OnItemSelectedListener 注 册 , OnItemSelectedListener  专 门 监听 选项 是否 被 选取 。 接下 来  37  行利 用匿 名 内部 类实 现  OnItemSelectedListener  的  onItemSelected()、onNothingSelected()  等  2  个方法。当选项被选取时, 

onItemSelected()  会自动被调用,而被选取的选项文字将以 Toast 消息框显示出来。 

27­30 行:调用 ArrayAdapter 构造方法以建立选项的内容与样式。选项的内容来自于 27 行的  places 字符串数组;样式则套用系统内置布局:android.R.layout.simple_spinner_item。 

31­32 行:调用 setDropDownViewResource()  套用系统内置的下拉列表样式:android.R.layout. 

simple_spinner_dropdown_item。 

33 行:Spinner 组件调用 setAdapter()套用指定的 ArrayAdapter 以加载对应的选项内容与样式。

5-3-2 AutoCompleteTextView 

AutoCompleteTextView  非 常 类 似  EditText  , 都 是 方 便 用 户 输 入 的 组 件 。 不 过  AutoCompleteTextView 组件另外提供提示文字列表, 当用户输入的局部文字符合提示文字时,

应用程序就会自动列出符合的提示文字列表, 让用户可以直接选择想输入的文字而不必将全部文字 输入完毕,是一种方便使用者输入的设计。 

AutoCompleteTextView 组件的提示列表与 Spinner 组件的选项建立方式相同,都是在文本文件 内建立字符串数组来储存欲提示的文字。

范例 AutoCompleteEx 

图 5­13

范例说明:

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 一节说明,不再赘述。 

相關文件