2013年11月14日

Android─spinner 下拉式選單基本用法

在Android開發app的時候,常需要做選單的選取。
但是在手機螢幕大小,無法讓我們將所有的選項都放進去螢幕中。
所以Android提供了Spinner widget,讓開發者可以在有限的畫面範圍內仍可放入所需的資料。

首先我們先在XMl檔放入兩個Spinner,一個是kind、另一個是name



     
    

    
    

    
    

     
    



在程式的功能是
在選擇kind spinner會改變 name spinner顯示的選項
在選取name 的spinner會跳出toast,show出選擇的名稱
程式碼如下
public class MainActivity extends Activity {
private ArrayAdapter listAdapter;
private ArrayAdapter nameAdapter;
private Spinner kind = null;
private Spinner name = null;
private String itemname[] = null;
//showtoast flag是用來判斷是否 name spinner有被選取
private boolean showtoast=false;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  initui();
  listAdapter = new ArrayAdapter(this, R.layout.spinnerlayout,
    new String[] { "肉類", "蔬菜", "水果" });
                //設定下拉式選單顯示的版面
  listAdapter.setDropDownViewResource(R.layout.spinner_dropdown);
                //設定kind spinner顯示的字串內容
  kind.setAdapter(listAdapter);
                //設定當kind spinner item選取後的動作
  kind.setOnItemSelectedListener(spinnerlistener);
 }

      //初始化UI function
      private void initui() {
  kind = (Spinner) findViewById(R.id.kind);
  name = (Spinner) findViewById(R.id.name);
 }

 AdapterView.OnItemSelectedListener spinnerlistener = new AdapterView.OnItemSelectedListener() {
  @Override
  public void onItemSelected(AdapterView adapterView, View view,
    int position, long id) {
                        //當選取的spinner是kind時
   if (adapterView.getId() == R.id.kind) {
                                 //判斷選取的種類是何種,設定相對應的字串陣列內容
    switch (adapterView.getSelectedItemPosition()) {
    case 0:
     itemname = new String[] { "牛肉", "豬肉", "雞肉" };
     break;
    case 1:
     itemname = new String[] { "白菜", "香菜", "高麗菜" };
     break;
    case 2:
     itemname = new String[] { "蘋果", "香蕉", "西瓜" };
     break;
    }
                                //當itemanme不為空時,對spinner name進行初始化
    if (itemname != null) {
     setnameitem();
    }
   } else if (adapterView.getId() == R.id.name) {
    if(showtoast!=false)
    {
    Toast.makeText(MainActivity.this,
      "您選擇" + adapterView.getSelectedItem().toString(),
      Toast.LENGTH_LONG).show();
    }
    showtoast=true;
   }
  }
  @Override
  public void onNothingSelected(AdapterView arg0) {
  }
 };

 private void setnameitem() {
  showtoast=false;
  nameAdapter = new ArrayAdapter(this, R.layout.spinnerlayout,
    itemname);
  name.setAdapter(nameAdapter);
  name.setOnItemSelectedListener(spinnerlistener);
 }
}

設定Spinner顯示字體格式 spinnerlayout.xml 程式碼如下



設定Spinner下拉式選單版面格式 spinner_dropdown.xml 程式碼如下



程式畫面如下;



參考資料
http://xapps.cc/article/280
http://jim690701.blogspot.tw/2012/11/androidspinner.html
http://stackoverflow.com/questions/4923310/android-spinner-onitemselected-setonitemselectedlistener-not-triggering