FragmentBasic.kt 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package com.doverfuelingsolutions.issp.view.fragment
  2. import android.view.LayoutInflater
  3. import android.view.View
  4. import androidx.annotation.StringRes
  5. import androidx.appcompat.app.AlertDialog
  6. import androidx.appcompat.widget.AppCompatTextView
  7. import androidx.fragment.app.Fragment
  8. import androidx.fragment.app.FragmentManager
  9. import androidx.lifecycle.lifecycleScope
  10. import com.doverfuelingsolutions.issp.R
  11. import com.doverfuelingsolutions.issp.view.widget.FragmentToolbar
  12. import com.google.android.material.dialog.MaterialAlertDialogBuilder
  13. import com.doverfuelingsolutions.issp.utils.StringUtil
  14. import kotlinx.coroutines.delay
  15. import kotlinx.coroutines.launch
  16. abstract class FragmentBasic : Fragment() {
  17. private var basicDialog: AlertDialog? = null
  18. private var displayAfterDelay = false
  19. private var mToolbar: FragmentToolbar? = null
  20. fun setToolBar(toolbar: FragmentToolbar) {
  21. mToolbar = toolbar
  22. toolbar.setBackHandler { back() }
  23. toolbar.setOnCountdownFinish { home() }
  24. toolbar.setHomeHandler { home() }
  25. }
  26. fun loading(@StringRes string: Int) = loading(StringUtil.get(string))
  27. private fun loading(msg: String) {
  28. displayAfterDelay = true
  29. lifecycleScope.launch {
  30. // 避免异步响应过快造成闪屏
  31. delay(500)
  32. // 在 delay 时,可能已手动关闭
  33. if (displayAfterDelay) {
  34. mToolbar?.pauseCountdown()
  35. val view = LayoutInflater.from(requireContext()).inflate(R.layout.fragment_loading, null)
  36. view.findViewById<AppCompatTextView>(R.id.loadingTip)?.text = msg
  37. basicDialog = MaterialAlertDialogBuilder(requireContext())
  38. .setCancelable(false)
  39. .setView(view)
  40. .show()
  41. }
  42. }
  43. }
  44. fun hideLoading() {
  45. mToolbar?.resumeCountdown()
  46. displayAfterDelay = false
  47. basicDialog?.let {
  48. if (isVisible) it.dismiss()
  49. }
  50. }
  51. fun home() {
  52. val fragmentManager = requireActivity().supportFragmentManager
  53. val deep = fragmentManager.backStackEntryCount
  54. if (deep > 0)
  55. fragmentManager.popBackStack(
  56. fragmentManager.getBackStackEntryAt(0).id,
  57. FragmentManager.POP_BACK_STACK_INCLUSIVE
  58. )
  59. }
  60. fun back() {
  61. requireActivity().supportFragmentManager.popBackStack()
  62. }
  63. }