本文位址:http://www.cnblogs.com/rossoneri/p/4366018.html
Spinners介紹
Spinners提供了從一個集(set)中選擇某個值(value)的一個快速的方法。在預設狀态,一個spinner顯示它目前選擇的一個值。觸摸spinner會顯示一個含有所有其他有效值的下拉菜單,使用者可以從中選擇一個新值。

你可以使用 Spinner 對象在布局中添加一個 spinner。你應該在你的XML布局檔案中使用 <Spinner> 元素來添加。比如:
<Spinner
android:id="@+id/planets_spinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
為了用一個選項清單填充(populate) spinner,你需要在你的 Activity 或者 Fragment 源碼中指定(specify)一個 SpinnerAdapter。
用使用者的選項來填充Spinner(Populate the Spinner with User Choices)
你可以使用任何來源的選項來填充spinner,但一定要通過一個SpinnerAdapter來提供,比如一個ArrayAdapter,如果那些從資料庫查詢出來的選項是可用的,儲存在一個array或者一個CursorAdapter裡且有效的話。
比如說,如果那些用來填充spinner的有效選項是預先确定好的,你可以用一個在資源檔案中定義好的數組來提供選項:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="planets_array">
<item>Mercury</item>
<item>Venus</item>
<item>Earth</item>
<item>Mars</item>
<item>Jupiter</item>
<item>Saturn</item>
<item>Uranus</item>
<item>Neptune</item>
</string-array>
</resources>
使用像這樣的數組,你可以在你的 Activity 或者 Fragment 用以下代碼借助一個 ArrayAdapter 的執行個體來為 spinner 提供資料:
Spinner spinner = (Spinner) findViewById(R.id.spinner);
// Create an ArrayAdapter using the string array and a default spinner layout
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.planets_array, android.R.layout.simple_spinner_item);
// Specify the layout to use when the list of choices appears
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Apply the adapter to the spinner
spinner.setAdapter(adapter);
createFromResource() 方法允許你從一個 string array 中建立一個 ArrayAdapter。其第三個參數是一個定義了被選中的選項如何在 spinner 控件中顯示的布局資源。simple_spinner_item 是一個平台提供的布局,也是你應該用的預設布局,除非你希望定義自己的 spinner 外觀。
之後你要調用 setDropDownViewResource(int) 來指定 spinner 顯示下拉選項的布局樣式(simple_spinner_dropdown_item 是另一個平台提供的标準布局)。
調用 setAdapter() 把你的 adapter 應用到 Spinner。
使用者選擇的響應(Responding to User Selections)
當使用者從下拉菜單選擇了一項内容, Spinner 對象接收到一個 on-item-selected 的事件。
為 spinner 定義一個選擇事件的處理方法,實作 AdapterView.OnItemSelectedListener 接口和對應的(corresponding) onItemSelected() 回調方法。比如:
public class SpinnerActivity extends Activity implements OnItemSelectedListener {
...
public void onItemSelected(AdapterView<?> parent, View view,
int pos, long id) {
// An item was selected. You can retrieve the selected item using
// parent.getItemAtPosition(pos)
}
public void onNothingSelected(AdapterView<?> parent) {
// Another interface callback
}
}
AdapterView.OnItemSelectedListener 要求 onItemSelected() 和 onNothingSelected() 回調方法。
然後你需要調用 setOnItemSelectedListener 指定接口的實作 (specify the interface implementation):
Spinner spinner = (Spinner) findViewById(R.id.spinner);
spinner.setOnItemSelectedListener(this);
如果你在你的 Activity 或者 Fragment 實作 AdapterView.OnItemSelectedListener 接口(就像上面的例子),你可以傳遞 this 作為接口執行個體。
Spinner類需要了解的内容
public class Spinner extends AbsSpinner implements DialogInterface.OnClickListener
Attribute Name | Related Method | Description |
android:dropDownHorizontalOffset | setDropDownHorizontalOffset(int) | Amount of pixels by which the drop down should be offset horizontally. |
android:dropDownSelector | List selector to use for spinnerMode="dropdown" display. | |
android:dropDownVerticalOffset | setDropDownVerticalOffset(int) | Amount of pixels by which the drop down should be offset vertically. |
android:dropDownWidth | setDropDownWidth(int) | Width of the dropdown in spinnerMode="dropdown". |
android:gravity | setGravity(int) | Gravity setting for positioning the currently selected item. |
android:popupBackground | setPopupBackgroundResource(int) | Background drawable to use for the dropdown in spinnerMode="dropdown". |
android:prompt | The prompt to display when the spinner\'s dialog is shown. | |
android:spinnerMode | Display mode for spinner options. |
int | MODE_DIALOG | Use a dialog window for selecting spinner options. |
int | MODE_DROPDOWN | Use a dropdown anchored to the Spinner for selecting spinner options. |
其他的一些方法就不列了,用什麼查什麼好了。
簡單的例子
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.android_spinner.MainActivity" >
<TextView
android:id="@+id/testview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/main_city" />
<Spinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Android_spinner</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
<string name="main_city">Choose your city : %1$s</string>
</resources>
MainActivity.java
1 package com.example.android_spinner;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import android.app.Activity;
7 import android.os.Bundle;
8 import android.view.Menu;
9 import android.view.MenuItem;
10 import android.view.View;
11 import android.widget.AdapterView;
12 import android.widget.AdapterView.OnItemSelectedListener;
13 import android.widget.ArrayAdapter;
14 import android.widget.Spinner;
15 import android.widget.TextView;
16
17 public class MainActivity extends Activity {
18
19 private Spinner mSpinner;
20 private TextView mTextview;
21 private List<String> cities = new ArrayList<String>();
22 private ArrayAdapter<String> adapter;
23 private String mStr;
24
25 @Override
26 protected void onCreate(Bundle savedInstanceState) {
27 super.onCreate(savedInstanceState);
28 setContentView(R.layout.activity_main);
29
30 initData();
31 initEvent();
32 }
33
34 private void initData() {
35 mStr = getResources().getString(R.string.main_city);
36 // 添加spinner清單項
37 cities.add("Beijing");
38 cities.add("Shanghai");
39 cities.add("Guangzhou");
40 cities.add("Shenzhen");
41 cities.add("Nanjing");
42
43 mTextview = (TextView) findViewById(R.id.testview);
44 mSpinner = (Spinner) findViewById(R.id.spinner);
45
46 String str = String.format(mStr, cities.get(0));
47 mTextview.setText(str);
48
49 // 為下拉清單建立adapter
50 adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, cities);
51
52 // 為adapter設定下拉菜單樣式
53 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
54
55 // spinner設定adapter
56 mSpinner.setAdapter(adapter);
57
58 }
59
60 private void initEvent() {
61 // 添加spinner事件
62 mSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
63
64 @Override
65 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
66 // TODO Auto-generated method stub
67 String str = String.format(mStr, adapter.getItem(position));
68 mTextview.setText(str);
69
70 parent.setVisibility(View.VISIBLE);
71 }
72
73 @Override
74 public void onNothingSelected(AdapterView<?> parent) {
75 // TODO Auto-generated method stub
76 mTextview.setText("None selected");
77 parent.setVisibility(View.VISIBLE);
78 }
79 });
80
81 }
82
83 @Override
84 public boolean onCreateOptionsMenu(Menu menu) {
85 // Inflate the menu; this adds items to the action bar if it is present.
86 getMenuInflater().inflate(R.menu.main, menu);
87 return true;
88 }
89
90 @Override
91 public boolean onOptionsItemSelected(MenuItem item) {
92 // Handle action bar item clicks here. The action bar will
93 // automatically handle clicks on the Home/Up button, so long
94 // as you specify a parent activity in AndroidManifest.xml.
95 int id = item.getItemId();
96 if (id == R.id.action_settings) {
97 return true;
98 }
99 return super.onOptionsItemSelected(item);
100 }
101 }
效果:
參考
android下拉菜單spinner的使用方法