관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[안드로이드] Spinner 사용시 해당 프래그먼트에서 다른 프래그먼트갔다가 돌아왔을 시 나는 에러 처리 (Fragment spinner error) 본문

안드로이드/코틀린 & 아키텍처 & Recent

[안드로이드] Spinner 사용시 해당 프래그먼트에서 다른 프래그먼트갔다가 돌아왔을 시 나는 에러 처리 (Fragment spinner error)

막무가내막내 2020. 9. 28. 18:11
728x90

 

[2021-04-14 업데이트]

 

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter view
        at com.mtjin.nomoneytrip.views.community.CommunityFragment$initView$1.onItemSelected(Unknown Source:7)
        at android.widget.AdapterView.fireOnSelected(AdapterView.java:1366)
        at android.widget.AdapterView.dispatchOnItemSelected(AdapterView.java:1355)
        at android.widget.AdapterView.selectionChanged(AdapterView.java:1339)
        at android.widget.AdapterView.checkSelectionChanged(AdapterView.java:1530)
        at android.widget.AdapterView.handleDataChanged(AdapterView.java:1506)
        at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:191)
        at android.widget.Spinner.onMeasure(Spinner.java:631)
        at androidx.appcompat.widget.AppCompatSpinner.onMeasure(AppCompatSpinner.java:436)
        at android.view.View.measure(View.java:24953)

스피너를 사용하는데 다른 프래그먼트로 이동했다가 백스택에 있는 스피너를 사용한 프래그먼트로 돌아 왔을 시 위와 같은 에러가 났습니다.

 

Spinner 의 AdapterView.OnItemSelectedListener 관련 에러였는데요.

문제는 onItemSelected() 콜백이 Android 프레임 워크에 의해 두 번 호출되고, 뷰 매개 변수가 처음에 null이고 두 번째로 인스턴스화되서 나는 에러였습니다.

 

이 문제를 해결하기 위해 두 가지 방법이 있습니다.

 

1. 기존 false(animate) 를 안붙이고 setSelection(0) 만 하엿는데 false 를 두 번째 매개변수로 넣어주면 해결됩니다. 

애니메이션 매개 변수와 함께 사용하는 경우 onItemSelected는 setSelection을 수행 할 때 호출되지 않습니다. 애니메이션 매개 변수를 사용하지 않으면 setSelection이 즉시 onItemSelected를 호출합니다.

binding.spCities.setSelection(0, false)

이 방법을 사용시 처음 스피너색상이 안바뀌는 문제가 있어 저는 두번째 방법을 사용했습니다.

 

 

 

2. 두번째 방법입니다. View가 null 인지 체크하는 것입니다. 처음 onItemSelectedListener 에서 view가 nonNull 로 되어있는데 그것을 ?를 붙여 nullable 하게 바꿔주고 제가 널 체크를 해주도록 했습니다.

binding.spCities.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(
                parent: AdapterView<*>,
                view: View?,
                position: Int,
                id: Long
            ) {
                view?.let {
                    viewModel.requestReviews((parent.getChildAt(0) as TextView).text.toString())
                    (parent.getChildAt(0) as TextView).setTextColor(thisContext.getMyColor(R.color.colorOrangeF79256))
                }
            }

            override fun onNothingSelected(parent: AdapterView<*>) {
            }
        }

 

 

 

 

해결방법 참고한 곳 입니다. 여기서 더 자세히 보시면 될 것 같습니다.

stackoverflow.com/questions/30253238/android-spinners-onitemselected-executed-twice-when-going-back-to-fragment/30253459

 

Android Spinner's onItemSelected executed twice when going back to Fragment

I created a spinner for my Fragment that populates it with data retrieved from an HTTP callout. When the Fragment is first created, I populate the spinner with its selection choices, set its

stackoverflow.com

 

 

 

댓글과 공감은 큰 힘이 됩니다. 감사합니다. !!

728x90
Comments