iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 13
0
Mobile Development

iOS Developer Learning Android系列 第 13

iOS Developer Learning Android. Lesson 13 - Spinner + DatePickerDialog (UIPickerView的代替品:下拉選單)

以前如果我們有多個有關連的欄位
通常會使用UIPickerView
它可以設定多個滾輪
Android好像比較沒有類似的東西
如果使用下拉選單(Spinner)也是滿常見的做法

我們先看一下今天的成果

對照表☘️☘️☘️

Android iOS
Spinner UIPickerView
DatePickerDialog UIDatePicker

常用屬性與一些說明

  1. Spinner
    1. spinnerMode//有dialog跟dropdown兩種,dropdown就是下拉選單
    2. entries//設定資料,先在XML定義好
    <string-array name="constellation_type">
        <item>請選擇星座類型</item>
        <item>水象</item>
        <item>火象</item>
        <item>風象</item>
        <item>土象</item>
    </string-array>

實作

基本上沒什麼問題
Spinner就setOnItemSelectedListener
EditText就setOnClickListener跟setOnFocusChangeListener

但是因為我想給下拉選單一個預設值
不要直接選第一個
結果卡了超久

  1. prompt//無效
  2. 說要自訂spinner adapter (也太麻煩了吧)

android spinner 一般預設是選中第一項
但是有時我們需要一開始是 [未選取] 或 [請選擇]
點選spinner後出現選項,點了某個選項後就顯示他。
要達到此目的須自己另外撰寫 spinner adapter

  1. 這個也說要用NothingSelectedSpinnerAdapter

Prompt is used to show title on dropdown popup not for default text.
I think you are looking for setting the default value on spinner when you have not selected any value from spinner dropdown. For that you need to use NothingSelectedSpinnerAdapter,

  1. 後來想說會不會是在public void onNothingSelected(AdapterView<?> adapterView)裡呼叫
    但也試不太出來

最後想到直接在資料裡面插入第一筆當作預設值就好了
只是這樣要另外判斷有點髒....

其他注意事項

  1. 一進畫面EditText就會被自動focus
    如果不想要的話....就把layout先focus XDDDDDD
    (android:focusableInTouchMode="true")
  2. 原生API會自動跳出i, i1, i2 是沙小⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️
    誰看得懂啊(╰(‵□′)╯︵┴┴)
        DatePickerDialog.OnDateSetListener d = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
                editTextDay.setText(i + "/" + i1 + "/" + i2);
            }
        };
  1. 當你找一個變數去接DatePickerDialog的時候就會報錯說要API24

...


new DatePickerDialog(this, d, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH).show()
直接秀出來就好
4. 就算你在XML寫了二維陣列,裡面的那層會變成字串...= =

    <array name="constellation_total">
        <item>
            <array name="constellation_water1">
            <item>雙魚座(2/19-3/20)</item>
            <item>巨蟹座(6/22-7/22)</item>
            <item>天蠍座(10/24-11/22)</item>
            </array>
        </item>
        <item>
            <array name="constellation_fire1">
                <item>牧羊座(3/21-4/20)</item>
                <item>獅子座(7/23-8/22)</item>
                <item>射手座(11/23-12/21)</item>
            </array>
        </item>
        <item>
            <array name="constellation_air1">
                <item>水瓶座(1/20-2/18)</item>
                <item>雙子座(5/21-6/21)</item>
                <item>天秤座(9/23-10/23)</item>
            </array>
        </item>
        <item>
            <array name="constellation_earth1">
                <item>金牛座(4/21-5/20)</item>
                <item>處女座(8/23-9/22)</item>
                <item>摩羯座(12/22-1/20)</item>
            </array>
        </item>
    </array>


5. 挑時間是用TimePickerDialog

繼承關係

java.lang.Object
↳ android.view.View
↳ android.view.ViewGroup
↳ android.widget.AdapterView<android.widget.SpinnerAdapter>
↳ android.widget.AbsSpinner
↳ android.widget.Spinner

java.lang.Object
↳ android.app.Dialog
↳ android.app.AlertDialog
↳ android.app.DatePickerDialog

參考資料

今天的範例程式

可以去 https://github.com/mark33699/IDLA 看一下順便給顆⭐️


上一篇
iOS Developer Learning Android. Lesson 12 - ImageView + ImagePicker (想知道如何把歪掉的照片調正嗎?)
下一篇
iOS Developer Learning Android. Lesson 14 - SeekBar + ProgressBar (原生就有的SVProgressHUD)
系列文
iOS Developer Learning Android30

尚未有邦友留言

立即登入留言