情境
平常我們進行一些非同步的處理時,總是會出現等待時間,這時候就會塞入 ProgressDialog 請使用者稍待片刻,但是,ProgressDialog 目前被官方棄用。
This class was deprecated in API level 26.
因此,我們可以透過另外一個方式來完成這個功能,這個替代方案就是 ProgressBarFragment。
完整程式碼
如果你需要完整程式碼,可以到 GitHub 上觀看或下載。
說明
所謂 ProgressBarFragment 其實就是把 ProgressBar 跟 Fragment 進行結合,官方希望你使用 ProgressBar 嵌入 layout 內,但是有時候需求是希望能夠跳出一個 Dialog ,這時候,你就可以透過這樣的方式完成,當然,你也可以透過 AlertDialog 來完成,不過,那是另外一種方式了,可以參考如何使用ProgressDialog的替代方案。
這邊其實很簡單,我們設計了一個自定義的 DialogFragment,透過這個方式來幫忙處理讀取時,跳出對應的訊息請使用者等待。
首先,我們先定義好 DialogFragment。
class ProgressbarFragment : DialogFragment() {
private lateinit var title: String
companion object {
const val TITLE = "title"
fun newInstance(title: String): ProgressbarFragment {
val fragment = ProgressbarFragment()
val args = Bundle().apply {
putString(TITLE, title)
}
fragment.arguments = args
return fragment
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
info_text.text = title
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_progressbar, container, false)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.run {
title = getString(TITLE, "")
}
}
}
接著在 MainActivity 中直接呼叫這個 DialogFragment 即可。
loading_btn.setOnClickListener {
supportFragmentManager.let{
ProgressbarFragment.newInstance("讀取中").show(it, "")
}
}
這樣就會看到以下畫面,還沒按下以前。
按下按鈕以後,會跳出一個讀取等待的 Dialog。
這樣就是一個簡單的 ProgressBarFragment 了。