룬아님의 취중코딩

Koin으로 Dialog 사용하기 본문

개발/안드로이드 개발

Koin으로 Dialog 사용하기

룬아님 2019. 8. 17. 14:47

앱을 제작할 때에 로딩 다이얼로그 같은 것들은 거의 모든 화면에서 네트워크 통신 중에 사용됩니다.

저는 Koin으로 의존성을 주입하고 dialog를 사용하려고 하였습니다.

 

 

Application을 상속받아 startKoin을 선언하고

startKoin {
            androidLogger()
            androidContext(this@MyApplication)
            modules(module)
        }

 

매니페스트의 application name도 바꿔줍니다

<application
            android:name=".MyApplication"
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"

 

모듈을 선언할 때에 context로 androidContext()를 사용한다면

Unable to add window -- token null is not for an application 에러가 발생하게 됩니다.

2019/08/05 - [개발/안드로이드 개발] - 다이얼로그에 왜 application context를 사용하면 안될까?

factory {
        AppCompatDialog(androidContext())
            .apply {
                setCancelable(false)
                window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
                setContentView(R.layout.dialog_loading)
                val animationView = this.iv_frame_loading
                animationView.setAnimation("loading.json")
                animationView.repeatCount = LottieDrawable.INFINITE
                animationView.playAnimation()
            }
    }

 

그렇기 때문에 저는 Context를 해당 엑티비티에서 인자로 받아오도록 구현하였습니다.

factory module: Module = module {
    single { (context: Context) ->
        AppCompatDialog(context)
            .apply {
                setCancelable(false)
                window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
                setContentView(R.layout.dialog_loading)
                val animationView = this.iv_frame_loading
                animationView.setAnimation("loading.json")
                animationView.repeatCount = LottieDrawable.INFINITE
                animationView.playAnimation()
            }
    }
}

 

그리고 BaseActivity를 만들고 그 안에 아까 만들었던 AppCompatDialog를 주입해 주었습니다.

또한 parametersOf를 사용하여 activity의 context를 넘겨주었습니다.

val progressDialog: AppCompatDialog by inject { parametersOf(this) }
반응형
Comments