伊莉討論區

標題: android studio 下拉式選單的內容 怎麼分別去使用? [打印本頁]

作者: as3508090    時間: 2018-5-1 12:47 PM     標題: android studio 下拉式選單的內容 怎麼分別去使用?

本帖最後由 as3508090 於 2018-5-1 12:49 PM 編輯

[attach]123231078[/attach]
目前這個功能是 當我選擇A時        會跳出 我選擇A
                     當我選擇魯肉飯時 會跳出 我選擇魯肉飯

他這種寫法是 不同選項 單一的顯示

但我想把它改成 我選擇A時       會跳出 你好
                     我選擇魯肉飯時 會跳出 魯肉飯好吃

就是怎麼讓我自己控制 每個選項 做不同的事?


作者: codewice    時間: 2018-5-1 08:08 PM

對 Spinner 以及它的 OnItemSelectedListener 來說,它從來都不知道什麼水餃、陽春麵。它只會知道 1) 要拿哪一些東西來顯示 (一堆字串)  2) 第幾個被選了

第幾個被選了,要做什麼事情,以你的範例來說就是「從字串陣列裡面挑一個字串出來,用 Toast 來顯示」

只不過剛剛好地,Spinner 顯示用的字串陣列,跟 item-selected 之後所使用的陣列剛好是同一個,兩者之間剛好是一對一的關係,所以我們可以用 Position 去找出來,不用擔心 ArrayOutOfBoundException。

回到你的問題,最直覺的方式就是在 onItemSelected 裡面用 Position 去選擇你要的邏輯
  1. if (position == 0) {
  2.     Toast.makeText(... "你好"... );
  3. } else if (position == 1) {
  4.     Toast.makeText(... "滷肉飯好吃"... );
  5. } else {
  6.     Toast.makeText(... "其它"... );
  7. }
複製代碼
這時候直覺會想到的第一個問題是,邏輯跟選項數量不對齊怎麼辦?未來要是多增加一個選項到 Lunch 裡面,整個邏輯不就要修改了?一個解法就是我們弄一個更豐富的資料結構,把它的品項名稱跟處理方法都放進去

舉例來說,我們產生一個新的 class,裡面有 name 跟 type。name 就是我們希望放在選單裡面的字串,type 就是品項的類型(通常會用 enum,為了舉例方便不寫那麼複雜,直接用 int 就好)。
  1. class LunchOption {
  2.     String name;
  3.     int type;
  4.     LunchOption(String name, int type) {
  5.         this.name = name;
  6.         this.type = type;
  7.     }

  8.     @Override
  9.     public String toString() {
  10.         return this.name;
  11.     }

  12.     public void perform() {
  13.         if (type == 0) {
  14.             Log.d("Log", "你吃了" + this.name);
  15.         } else if (type == 1) {
  16.             Log.d("Log", "你喝了" + this.name);
  17.         } else {
  18.             Log.d("Log", "你瞧著手上的" + this.name + "卻不知道該怎麼辦);
  19.         }
  20.     }
  21. }
複製代碼
接下來就是用它了
  1. final LunchOption[] options = new LunchOption[4];
  2. options[0] = new LuncOption("滷肉飯", 0);
  3. options[1] = new LuncOption("排骨飯", 0);
  4. options[2] = new LuncOption("珍珠奶茶", 1);
  5. options[3] = new LuncOption("寫真集", 2);

  6. ArrayAdapter<LunchOption> lunchList = new ArrayAdapter(context, android.R...., options);
  7. spinner.setAdapter(lunchList);
  8. spinner.setOnItemSelectedList(new ..... {
  9.     @Override
  10.     public void onItemSelected(....,int position, ..) {
  11.         options[position].perform();
  12.     }
  13. });
複製代碼

作者: jackyo04    時間: 2018-7-5 05:18 PM

你可以根據選擇的位置來判斷,Position 這東西,初始位置為0或-1看你怎麼設定的,當選到哪個位置就在判斷式內加你想要的內容




歡迎光臨 伊莉討論區 (http://www69.eyny.com/) Powered by Discuz!