안드로이드 개발자의 창고
[안드로이드 스튜디오] Attempt to invoke virtual method 'android.os.IBinder android.view.View.getWindowToken()' on a null object reference 해결 본문
오류 해결
[안드로이드 스튜디오] Attempt to invoke virtual method 'android.os.IBinder android.view.View.getWindowToken()' on a null object reference 해결
Wise-99 2023. 7. 7. 18:42✔️ 오류 및 원인
화면이 전환될 때 키보드를 자동으로 올려주기 위해서 InputMethodManager를 사용했다.
비동기적 처리를 위해서 thread를 이용하였는데 getWindowToken()이 null을 반환한다는 오류이다.
lateinit var mainActivity: MainActivity
val imm = mainActivity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
mainActivity = activity as MainActivity
...
// 포커스 설정
dialogBinding.editTextAddCategory.requestFocus()
// 키보드 올림
thread {
SystemClock.sleep(500)
imm.showSoftInput(mainActivity.currentFocus, 0)
}
해당 코드는 Fragment에서 mainActivity를 받아 currentFocus를 사용하는 방식이었는데
생각해보니 mainActivity.currentFocus가 아니라 현재 Fragment의 View를 넣어야 null이 안나오지 않을까 싶었다.
✔️ 해결 방법
imm.showSoftInput(포커스가 설정된 뷰, 0)으로 코드를 바꿨더니 해결됐다!
내 경우에는 dialog 안에 있는 editText라서 아래와 같이 설정해줬다.
lateinit var mainActivity: MainActivity
val imm = mainActivity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
mainActivity = activity as MainActivity
...
// 포커스 설정
dialogBinding.editTextAddCategory.requestFocus()
// 키보드 올림
thread {
SystemClock.sleep(500)
imm.showSoftInput(dialogBinding.editTextAddCategory, 0)
}