什麼是EasyToast
EasyToast是開源基礎元件整合庫EasyAndroid中的基礎元件之一。用於進行簡化Toast操作。
EasyAndroid作為一款整合元件庫,此庫中所整合的元件,均包含以下特點,你可以放心使用~~
1. 設計獨立
元件間獨立存在,不相互依賴,且若只需要整合庫中的部分元件。也可以很方便的
只copy對應的元件檔案
進行使用
2. 設計輕巧
因為是元件整合庫,所以要求每個元件的設計儘量精練、輕巧。避免因為一個小功能而引入大量無用程式碼.
每個元件的方法數均
不超過100
. 大部分元件甚至不超過50
。
得益於良好的高內聚性
,若你只需要使用EasyToast. 那麼可以直接去copy EasyToast原始碼檔案到你的專案中,直接進行使用,也是沒問題的~
特性
- 一行程式碼搞定自定義樣式Toast
- 可直接在任意執行緒中進行使用
- 當有新訊息需要展示時。進行即時重新整理。無需等待
用法
使用預設樣式
我們來與原生使用方式進行下對比:
1. 原生方式
一般來說。使用預設樣式時,我們通常都是使用下方的程式碼進行toast展示:
Toast.makeText(context, message, duration).show()
複製程式碼
2. EasyToast方式
而對於EasyToast而言。我們只需要像下面這樣呼叫即可:
EastToast.newBuilder().build().show(message)
複製程式碼
或者使用資源id:
EasyToast.newBuilder().build().show(R.string.message)
複製程式碼
當然,這個時候有人可能會說了。你這樣也沒比原生方式方便多少嘛!hold on! 別急。
由於這種使用預設Toast
的場景很多。所以這裡我在EasyToast類中預設提供了DEFAULT
例項進行直接使用:
EasyToast.DEFAULT.show(message)
複製程式碼
這樣是不是就很簡潔很一目瞭然了?
使用自定義樣式
1. 原生方式
我們先來看,使用原生的方式進行toast定製應該是怎麼樣的:
// 1. 建立Toast例項
val toast = Toast(context)
// 2. 獲取自定義佈局與用於展示的文字控制元件
val container = LayoutInflater.from(context).inflate(R.layout.custom_toast, null)
val tv = container.findViewById(R.id.toast_tv)
// 3. 將控制元件與toast例項繫結
toast.view = contaienr
toast.duration = Toast.LENGTH_SHORT
// 最後設定值進行展示:
tv.setText(message)
toast.show()
複製程式碼
2. EasyToast方式
// 建立例項時直接指定資原始檔即可
EasyToast.newBuilder(R.layout.custom_toast, R.id.toast_tv)
.build().show(message)
複製程式碼
可以看到。與預設樣式相比。在進行自定義樣式使用時,EasyToast能節省更多的程式碼。
當然,上面的寫法,將建立與展示放在一起的做法,是不推薦的。推薦的方式是進行一次二次封裝
. 將專案中所需要使用到的所有toast樣式進行統一管理:
object ToastTools {
val default:EasyToast = EasyToast.DEFAULT// 預設樣式
val customForNetwork:EasyToast by lazy {// 網路層獨有樣式
return EasyToast.newBuilder(R.layout.network_toast, R.id.toast_tv).build()
}
// 更多的樣式
...
}
複製程式碼
新增gravity與duration配置
既然是對Toast的封裝, 那麼Toast本身自帶的gravity
與duration
配置當然也是支援的。
為了方式使用時產生混亂。EasyToast
只支援在進行例項建立時進行屬性配置:
val toast = EasyToast.newBuilder()
// 設定gravity. 參考Toast#setGravity(gravity, offsetX, offsetY)方法
.setGravity(gravity:Int, offsetX:Int, offsetY:Int)
// 設定duration.參考Toast#setDuration(duration)方法
.setDuration(Toast.LENGTH_SHORT | Toast.LENGTH_LONG)
.build()
複製程式碼
在任意位置進行toast展示:
正如你上面看到的:EasyToast的展示。不再像原生toast一樣。需要依賴外部傳入context例項進行UI展示。而是直接指定具體的資料即可,這在一些工具庫中需要進行展示時。是個很棒的特性:
EasyToast.DEFAULT.show(message)
複製程式碼
在任意執行緒進行toast展示:
這點是原生所不能比的。使用原生的Toast。你必須在UI執行緒
中進行toast的建立與展示
而EasyToast則沒有此顧慮:因為對於EasyToast來說。toast的建立與展示。都是會被派發到主執行緒進行操作的:
fun show(message:String) {
...
if (Looper.myLooper() == Looper.getMainLooper()) {
showInternal(result)
} else {
mainHandler.post { showInternal(result) }
}
}
複製程式碼
即時更新toast文案
我們都知道:在使用原生的Toast.makeTest().show()
方式直接進行toast展示時。在連續發起多次toast展示請求時,系統會依次的
對所有文案進行一個個
的展示。
這是因為在Toast.makeText().show()
中。每次都是使用的新建Toast例項
進行展示. 而系統在同一時刻,只能使用一個Toast例項
進行展示,其餘的Toast例項的展示,需要等待當前文案展示完畢後
才會被觸發進行展示。
所以,要解決多次連續展示
的問題。我們只需要做到:使用同一個Toast例項進行展示即可:
如果你需要的是進行預設樣式展示,那麼直接使用提供的預設Toast進行展示即可:
EasyToast.DEFAULT.show(content)
複製程式碼
當然,有些時候,UI會要求對展示樣式進行美化,所以你會需要使用自定義的Toast樣式進行展示。所以此時你可以:使用一個變數接收建立的EasyToast例項。然後在展示的地方直接使用此例項進行文案展示:
// 建立自定義的EasyToast例項
val custom = EasyToast.EasyToast.newBuilder(layoutId, tvId).build()
// 在使用處。直接使用建立的例項進行展示:
custom.show(content)
複製程式碼
讓我們來展示一個在子執行緒中連續展示toast文案的案例:
executor.execute {
for (index in 0..10) {
EasyToast.DEFAULT.show("自動更新無延遲提醒:$index")
Thread.sleep(300)
}
EasyToast.DEFAULT.show("迴圈完畢")
}
複製程式碼
效果展示
可以明顯看到。介面展示的toast文案是被即時更新
的