iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 30
0
自我挑戰組

跟Kotlin一起來聊Android元件 或許還有應用,或許還有一些資訊雜談系列 第 30

Android中取代Enum的用法@IntDef 及完賽感想

會提到這個是因為剛好在BottomSheetBehavior.BottomSheetCallback中使用到這個東西

一般我們在判斷狀態時,會習慣用Enum來表示狀態機。

所以當我們有狀態要判斷時

用Enum表示

enum class StateEnum(var value:Int) {
    STATE_DRAGGING(1),
    STATE_SETTLING(2), 
    STATE_EXPANDED(3), 
    STATE_COLLAPSED(4), 
    STATE_HIDDEN(5),
    STATE_HALF_EXPANDED(6)
}

使用時

var value : Int = number
when(value){
    StateEnum.STATE_DRAGGING.value         ->{ //do somethings}
    StateEnum.STATE_SETTLING.value         ->{ //do somethings}
    StateEnum.STATE_EXPANDED.value         ->{ //do somethings}
    StateEnum.STATE_COLLAPSED.value        ->{ //do somethings}
    StateEnum.STATE_HIDDEN.value           ->{ //do somethings}
    StateEnum.STATE_HALF_EXPANDED.value    ->{ //do somethings}  
}

或是

var value : StateEnum = state
when(value){
    StateEnum.STATE_DRAGGING         ->{ //do somethings}
    StateEnum.STATE_SETTLING         ->{ //do somethings}
    StateEnum.STATE_EXPANDED         ->{ //do somethings}
    StateEnum.STATE_COLLAPSED        ->{ //do somethings}
    StateEnum.STATE_HIDDEN           ->{ //do somethings}
    StateEnum.STATE_HALF_EXPANDED    ->{ //do somethings}  
}

但是Java中的Enum曾因為占用記憶體使用量而曾經被Google列為不建議使用,為此Google特意引入了一些相關的註解來替代列舉。

@IntDef


當我們設定好BottomSheetBehavior的狀態

public class States {
    public static final int STATE_DRAGGING = 1;
    public static final int STATE_SETTLING = 2;
    public static final int STATE_EXPANDED = 3;
    public static final int STATE_COLLAPSED = 4;
    public static final int STATE_HIDDEN = 5;
    public static final int STATE_HALF_EXPANDED = 6;


    @IntDef({STATE_DRAGGING, STATE_SETTLING, STATE_EXPANDED})
    @Retention(RetentionPolicy.SOURCE)
    public @interface StateInt {

    }

    public int getInt(@States.StateInt int state){
        return state;
    }
}

使用方法為

var mState=States().getInt(States.STATE_HIDDEN)
...

優點
除了可以減少資源占用量之外,
還可以使用@IntDef定義該States().getInt存取範圍

所以像上面var mState=States().getInt(States.STATE_HIDDEN)在編譯時是會報錯的,因為States.STATE_HIDDEN並不在存取範圍內

@IntDef({STATE_DRAGGING, STATE_SETTLING, STATE_EXPANDED})

要弄懂@IntDef其實還有很多東西要看,不過先簡單的知道有這個東西就好。


最後來個感想


完賽了

其實最終的感想就是這3個字。

你我都聽過什麼這不是終點,而是逗點甚至只是人生的一個頓號

你我都知道這雞湯看起來很好喝,但是每個人人生的食譜從來都不會一樣,就算照著作還是會有差異。

所以不要在意什麼 :
我都做得到,相信你也可以。
我當初那麼忙都可以,為什麼你不行之類的話語。

我們每個人生存的環境,接受的教育,到目前培養的能力經歷,需要承擔的責任與苦楚造就了現在正在看這篇文章的你我。

我們不一樣,但是可以朝著同一個目標前進。
我們不一樣,體諒包容或是不認同都是每個人的選擇。
我們不一樣,價值觀不同那就不同吧,但是請尊重每個人的價值。

如果你到目前對人生仍是樂觀堅強,請你繼續保持,相信這份正向能量可以溫暖很多你身邊的人。
如果你曾經遇過風雨、受過傷而仍持續前行,請確信你的韌性可以替周圍的人帶來勇氣。
如果你正遭遇痛楚,請試著尋求幫助,無論是自助或是人助,最終都會以各種形式過去的。

對目前的我,起碼是參賽之前的我來說,為自己設立一個目標並且明確地持續前進,其實是難以想像的。接受鐵人賽邀請之後,我曾考慮過不參加。原因有很多,但主要是我對目前的處境感到不安定。

而在今天我碰觸到了完賽的里程碑,過程中需要感謝的人事物很多,那就帶著這份心情繼續過日子吧。

謝謝各位。


上一篇
BottomSheet 自動調整最低高度behavior_peekHeight
系列文
跟Kotlin一起來聊Android元件 或許還有應用,或許還有一些資訊雜談30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Howard
iT邦新手 4 級 ‧ 2019-10-16 22:04:17

賀完賽/images/emoticon/emoticon64.gif

我要留言

立即登入留言