Привязать пользовательский DialogFragment к службе, инициализированной в области приложения.

Я работаю над приложением, которое делает несколько веб-звонков, и я хочу добавить DialogFragment (с ProgressBar в центре), который показывает, когда я жду завершения вызова.

Веб-вызовы расширены из AsyncTask частной библиотекой, которая предоставляет интерфейс (DialogInterface), чтобы указать, что делать, когда диалоговое окно отображается и скрывается. Для DialogFragment я нашел здесь хороший код:
https://code.luasoftware.com/tutorials/android/android-show-loading-and-prevent-touch/

Он работает без проблем из класса Activity, но DialogInterface должен быть установлен для построителя WebService, который инициализируется в классе Application.

Это последовательность инициализации в классе 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, поэтому этот код не работает.


person Alexsius    schedule 21.08.2019    source источник
comment
вы можете получить объект FragmentManager из объекта FragmentActivity, должны сделать объект активности в своем классе приложения   -  person asdcvf    schedule 22.08.2019


Ответы (1)


Вы можете зарегистрировать ActivityLifecycleCallbacks в классе Application, чтобы узнать, какое действие выполняется в данный момент, и получить 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?) {
            }
        })
    }
}
person Akaki Kapanadze    schedule 22.08.2019
comment
Извините, но это не сработало, во время компиляции все было в порядке, но не во время выполнения. Были и другие нулевые ссылки. Я узнал, что могу установитьDialogInterface даже из действия, получающего экземпляр WebService. Я сделал это в родительской деятельности, и теперь это работает. - person Alexsius; 23.08.2019