如何建立一個 ProgressFragment

如何建立一個 ProgressFragment

情境

平常我們進行一些非同步的處理時,總是會出現等待時間,這時候就會塞入 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 了。