ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

     

    Material Design

    Build beautiful, usable products faster. Material Design is an adaptable system—backed by open-source code—that helps teams build high quality digital experiences.

    material.io

     

    머티리얼 가이드에 따라 아래처럼 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 요소들을 초기화해줄 수 없다.

    반응형

    댓글

Written by 나도개발자.