마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

코틀린에서 상속받아 사용할때 변수 문제 질문드립니다.

0 추천

https://gun0912.tistory.com/72 이분의 코드를 코틀린에서 구현해보려 합니다.

 

코드는 BaseApplication에서 Progress를 설정하고,

BaseActivity에서 만들어 놓은 Progress기능을 가져온 후에

사용할 Activity에서 BaseActivity를 상속받아 바로바로 함수를 호출해서 쓸 수 있게 만든거라고 이해했습니다.

 

문제는 코틀린이 전역변수가 없다보니, 함수마다 다른 변수로 인식을 하는거 같습니다.

ProgressON()과 ProgressOFF()라는 함수가 있는데, 서로 다른 progressDialog를 인식하는지, ProgressON()이 정상 실행된 이후에 ProgressOFF()함수가 정상작동하지 않습니다 ㅠㅠ

 

전역변수가 없다보니 최대한 companion object를 이용해보려고 했습니다.

이것저것 테스트하는중이라 필요없는 코드도 조금 있습니다 ㅠㅠ

 

코드는 아래 첨부하였습니다.

 

 

BaseApplication.kt

class BaseApplication : Application() {

    lateinit var baseApplication: BaseApplication

    companion object {
        lateinit var progressDialog:AppCompatDialog
        fun getInstance(activity: Activity?): BaseApplication {
            progressDialog = AppCompatDialog(activity)
            var base = BaseApplication()
            return base
        }

    }

    override fun onCreate() {
        super.onCreate()
        baseApplication = this
    }

    fun progressON(activity: Activity?, message: String) {

        Log.d("@@@ BaseApp", "ProgressON")

//        progressDialog = AppCompatDialog(activity)

        if (activity == null || activity.isFinishing) {
            return
        }


        if (progressDialog != null && progressDialog!!.isShowing()) {
            progressSET(message)
        } else {

            progressDialog!!.setCancelable(false)
            progressDialog!!.getWindow()!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
            progressDialog!!.setContentView(R.layout.progress_loading)
            progressDialog!!.show()

        }


        val tv_progress_message = progressDialog!!.findViewById(R.id.tv_progress_message) as TextView?
        if (!TextUtils.isEmpty(message)) {
            tv_progress_message!!.text = message
        }


    }

    fun progressSET(message: String) {

        if (progressDialog == null || !progressDialog!!.isShowing()) {
            return
        }


        val tv_progress_message = progressDialog!!.findViewById(R.id.tv_progress_message) as TextView?
        if (!TextUtils.isEmpty(message)) {
            tv_progress_message!!.text = message
        }

    }

    fun progressOFF() {
        Log.d("@@@ BaseApp", "ProgressOFF")

        if(progressDialog ==null) {
            Log.d("@@@ BaseApp", "ProgressOFF - Null")
        } else {
            Log.d("@@@ BaseApp", "ProgressOFF - NotNull")
        }

        if(progressDialog.isShowing) {
            Log.d("@@@ BaseApp", "ProgressOFF - isShowing")
        }else{
            Log.d("@@@ BaseApp", "ProgressOFF - isNotShowing")
        }

        if (progressDialog != null && progressDialog!!.isShowing()) {
            Log.d("@@@ BaseApp", "ProgressOFF - True")
            progressDialog!!.dismiss()
        }else {
            Log.d("@@@ BaseApp", "ProgressOFF - False")
            progressDialog.dismiss()
        }
    }
}

 

BaseActivity.kt

open class BaseActivity : AppCompatActivity() {


    fun progressON() {
        BaseApplication.getInstance(this).progressON(this, "")
    }

    fun progressON(message: String) {
        BaseApplication.getInstance(this).progressON(this, message)
    }

    fun progressOFF() {
        BaseApplication.getInstance(this).progressOFF()
    }

}

 

 

떡빵s (1,370 포인트) 님이 2019년 6월 23일 질문

1개의 답변

0 추천

항상 dialog 를 instance 를 하고 있네요 

fun getInstance(activity: Activity?): BaseApplication {
    progressDialog = AppCompatDialog(activity)
 
  var base = BaseApplication()
    return base
}

progressDialog 를 예외 처리 하세요 

블로그 글에는 dialog instance 위치가 progressOn 에 존재합니다. 

 

aucd29 (218,390 포인트) 님이 2019년 6월 24일 답변
...