java - 将自定义 DialogFragment 绑定(bind)到初始化到应用程序范围的服务

标签 java android kotlin dialogfragment

我正在开发一个进行一些网络调用的应用程序,我想添加一个 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/

相关文章:

android - java.lang.IllegalStateException : View with id -1 错误

android - Anko DSL recyclerview 添加项目时的奇怪行为

android - 不支持的 kotlin 版本

kotlin - 如何在Kotlin中的POST请求中发送JSONArray?

java - 程序无法识别字符串是什么

java - SWT ComboBoxCellEditor 可编辑

android - 命名 AsyncTask 以在 Android 中进行分析

java - XSD 导入问题

java - 如何在 Play 的 2.0 WebSocket 中验证用户身份?

java - 如何在android中的OpenGL java中将文本或图像放在3D立方体之上(对象用于增强目的)