-
[Android/Kotlin] Fragment Exposed Dropdown Menu AutoCompleteTextView NullPointerException Issue안드로이드 개발 오류 해결 2020. 8. 29. 16:39
오류 내용
java.lang.NullPointerException:android.widget.AutoCompleteTextView.setAdapter(android.widget.ListAdapter)
참고 자료
↓구글 머티리얼 공식 가이드
https://material.io/develop/android/components/text-fields
머티리얼 가이드에 따라 아래처럼 layout을 잡아줬다.
<com.google.android.material.textfield.TextInputLayout ... style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu" app:endIconTint="@color/mainBlue"> <AutoCompleteTextView android:id="@+id/bank" android:layout_width="match_parent" android:layout_height="wrap_content" /> </com.google.android.material.textfield.TextInputLayout>
리스트 아이템 xml 파일도 만들어줬다.
[res] - [layout] - list_item.xml
<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp" android:ellipsize="end" android:maxLines="1" android:textAppearance="?attr/textAppearanceSubtitle1" />
그 후 items에 내가 원하는 목록을 적어주고, adapter를 AutoCompleteTextView에 적용시켜 주자 NullpNullPointerException가 나며 앱이 종료되었다.
class ContractFrag : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val items = listOf("NH농협", "KB국민", "신한", "우리", "하나", "IBK기업", "SC제일", "씨티", "KDB산업", "SBI저축", "새마을", "대구", "광주", "우체국", "신협", "전북", "경남", "부산", "수협", "제주", "카카오뱅크") val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_dropdown_item_1line, items) bank.setAdapter(adapter) } }
해결 방법
해결 방법은 아주 간단했다. 바로 코드를 onCreate 함수가 아닌 onViewCreated로 옮기는 것이다.
class ContractFrag : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val items = listOf("NH농협", "KB국민", "신한", "우리", "하나", "IBK기업", "SC제일", "씨티", "KDB산업", "SBI저축", "새마을", "대구", "광주", "우체국", "신협", "전북", "경남", "부산", "수협", "제주", "카카오뱅크") val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_dropdown_item_1line, items) bank.setAdapter(adapter) } }
오류 원인
오류의 원인은 lifecycle(생명주기) 때문이었다. Acticity의 생명주기와 Fragment의 생명주기에는 아래처럼 차이가있다. Fragment는 onCreateView에서 layout을 inflate 해오기 때문에 onCreate()에서 UI 요소들을 초기화해줄 수 없다.
반응형'안드로이드 개발 오류 해결' 카테고리의 다른 글
[Android/Kotlin] Fragment 전환시 버튼이 최상위에 보이는 Issue (2) 2020.09.09 [Android] textpassword적용 후 Edittext 입력이 안 보이는 Issue (2) 2020.08.25