我正在开发一个进行一些网络调用的应用程序,我想添加一个 DialogFragment(中间有一个 ProgressBar),以显示我何时等待调用完成。
网络调用是从 AsyncTask 扩展而来的,它有一个私有(private)库,它提供了一个接口(interface)(DialogInterface)来设置当对话框显示和隐藏时要执行的操作。
对于 DialogFragment,我从这里找到了一些不错的代码:
https://code.luasoftware.com/tutorials/android/android-show-loading-and-prevent-touch/
它在 Activity 类中工作没有问题,但 DialogInterface 必须设置为初始化到 Application 类中的 WebService 构建器
这是Application类中的初始化序列
WebService.init(
WebServiceBuilder(this)
.setBaseUrlTest("http://google.it/")
.setUrlType(UrlType.TEST)
.setDialogInterface(object : DialogInterface {
override fun showDialog(context: Context?) {
if (context != null)
val busyDialog = BusyDialogFragment.show(supportFragmentManager)
}
override fun hideDialog() {
//code that hide the DialogFragment
}
})
显然在 Application 类中我无法获取 FragmentManager,因此此代码不起作用。
最佳答案
您可以在Application
类中注册一个ActivityLifecycleCallbacks
来了解当前正在运行哪个Activity,并获取FragmentManager
:
class MyApplication : Application() {
private var currentActivityRef : WeakReference<FragmentActivity?>? = null
private val supportFragmentManager : FragmentManager?
get() = currentActivityRef?.get()?.supportFragmentManager
override fun onCreate() {
super.onCreate()
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
override fun onActivityStarted(activity: Activity?) {
currentActivityRef = WeakReference(activity as? FragmentActivity)
}
override fun onActivityStopped(activity: Activity?) {
currentActivityRef = null
}
override fun onActivityPaused(activity: Activity?) {}
override fun onActivityResumed(activity: Activity?) {}
override fun onActivityDestroyed(activity: Activity?) {}
override fun onActivitySaveInstanceState(activity: Activity?,
outState: Bundle?) {
}
override fun onActivityCreated(activity: Activity?,
savedInstanceState: Bundle?) {
}
})
}
}
关于java - 将自定义 DialogFragment 绑定(bind)到初始化到应用程序范围的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57600487/