-
[Kotlin] object 익명 클래스, 무명 객체 [anonymous object] 에서 View 접근하기LANGUAGE/ANDROID 2020. 6. 19. 13:41
화면에 다이얼로그를 띄우기 위해 아래와 같이 코드 작성을 했습니다. (TestDialog는 DialogFragment를 상속받습니다.)
TestDialog().apply { arguments = bundle onTestListener = object : TestDialog.OnTestListener { override fun onTestClick() { textView.text = "Click Event" } } show(supportFragmentManager, "TestDialog") }
실행 시켜보면 아래와 같은 NullPointException이 발생합니다.
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 왜 발생 했을까 생각해보다가 아래 내용이 관련있을거라 생각했습니다.
(개인적인 뇌피셜이니 틀린부분이 있으면 알려주세요~)
1. 코틀린 안드로이드 익스텐션
kotlin으로 Android 개발시 코틀린 안드로이드 익스텐션을 통해서 findViewById()를 하지 않고
View의 id 이름을 변수로 바로 사용 가능합니다.
View를 참조하기 위해 import 부분에 아래와 같이 추가된 것을 확인 할 수 있습니다.
import kotlinx.android.synthetic.main.사용하는xml.*
그래서 위의 다이얼로그 예시에서도 TextView의 id 이름으로 textView를 바로 사용 가능 했습니다.
2. object
익명 클래스로 object 사용시 새로운 인스턴스를 생성합니다.
내부에서는 외부 클래스 변수에 접근할 수 있고 수정 가능합니다. (자바의 경우 final이 되어야 해서 수정이 불가능합니다.)
결론
object 키워드를 통한 새로운 인스턴스 안에서는 VIew 객체가 생성되지 않아서 null인 상태가 되는것 같습니다.
그래서 아래처럼 this키워드를 통해 해당 클래스를 지정해줬더니 정상적으로 처리가 되었습니다.
TestDialog().apply { arguments = bundle onTestListener = object : TestDialog.OnTestListener { override fun onTestClick() { this@MainActivity.textView.text = "Click Event" } } show(supportFragmentManager, "TestDialog") }
'LANGUAGE > ANDROID' 카테고리의 다른 글
[Android] Webview Geolocation 사용하기 (0) 2020.08.24 외부 라이브러리 추가시 AndroidManifest.xml 병합 (0) 2020.07.08 FCM Android Backgroud (feat. app launch) (0) 2019.07.26 [Flutter] 설치 및 Android SDK Custom path 사용시 에러 (0) 2019.04.08 기존 Android Studio 프로젝트에 .so 파일 추가 및 사용 과정기! (0) 2019.01.29