EasyAndroid基礎整合元件庫之:EasyToast 簡化你的Toast操作

Haoge發表於2018-06-12

什麼是EasyToast

EasyToast是開源基礎元件整合庫EasyAndroid中的基礎元件之一。用於進行簡化Toast操作

EasyAndroid作為一款整合元件庫,此庫中所整合的元件,均包含以下特點,你可以放心使用~~

1. 設計獨立

元件間獨立存在,不相互依賴,且若只需要整合庫中的部分元件。也可以很方便的只copy對應的元件檔案進行使用

2. 設計輕巧

因為是元件整合庫,所以要求每個元件的設計儘量精練、輕巧。避免因為一個小功能而引入大量無用程式碼.

每個元件的方法數均不超過100. 大部分元件甚至不超過50

得益於良好的高內聚性,若你只需要使用EasyToast. 那麼可以直接去copy EasyToast原始碼檔案到你的專案中,直接進行使用,也是沒問題的~

特性

  1. 一行程式碼搞定自定義樣式Toast
  2. 可直接在任意執行緒中進行使用
  3. 當有新訊息需要展示時。進行即時重新整理。無需等待

用法

使用預設樣式

我們來與原生使用方式進行下對比:

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本身自帶的gravityduration配置當然也是支援的。

為了方式使用時產生混亂。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("迴圈完畢")
}
複製程式碼

效果展示

EasyAndroid基礎整合元件庫之:EasyToast 簡化你的Toast操作

可以明顯看到。介面展示的toast文案是被即時更新

相關文章