0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

spinnerのある画面を回転させると、AdapterView.OnItemSelectedListenerがnullポで落ちる

Last updated at Posted at 2023-02-22

画面を回転させると、アプリが落ちる

こんな画面で、

回転させると、

--------- beginning of crash
14:49:36.123  D  Shutting down VM
14:49:36.124  E  FATAL EXCEPTION: main
                 Process: com.example.spinnernamevalue, PID: 3232
                 java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter view
                 	at com.example.spinnernamevalue.MainActivity$onCreate$1.onItemSelected(Unknown Source:2)
                 	at android.widget.AdapterView.fireOnSelected(AdapterView.java:957)
                 	at android.widget.AdapterView.dispatchOnItemSelected(AdapterView.java:946)
                 	at android.widget.AdapterView.selectionChanged(AdapterView.java:935)

どうやら、落ちている箇所はここ

spinner.onItemSelectedListener = object: AdapterView.OnItemSelectedListener {
    // アイテムが選択された時
    override fun onItemSelected(parent: AdapterView<*> ,view: View, position: Int, id: Long) {
        val spinnerParent = parent as Spinner
        val myItem = spinnerParent.selectedItem as MyItem
        textView.text = myItem.name
        editText.setText(myItem.code)
    }

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

onItemSelectedの第2引数のviewがnullで渡ってきているらしい。ここはAPI仕様的には

public abstract void onItemSelected (AdapterView<?> parent, 
                View view, 
                int position, 
                long id)

パラメータの説明を見るとこのようになっている。

parameter 説明
parent AdapterView: The AdapterView where the selection happened
view View: The view within the AdapterView that was clicked
position int: The position of the view in the adapter
id long: The row id of the item that is selected

デバッカで止めてみてみるとparentにはspinnerのインスタンスがわたってきている。viewは
TextViewが渡ってきている。これはおそらく、今、タップしたspinnerで表示されている内容のTextViewを意味するのだろう。

画面回転だと、タップしないので第2引数のviewがnullになっているのだと思う。

- override fun onItemSelected(parent: AdapterView<*>,view: View, position: Int, id: Long) {
+ override fun onItemSelected(parent: AdapterView<*>?,view: View?, position: Int, id: Long) {

第2引数のviewをnull可にすることによって、nullポで落ちなくなった。どうせ、onItemSelectedの中で使ってないし・・・ついでに、第1引数のparentもnull可にしたけど、こっちは回転してもnullになることはないようだ。

API仕様的にはJava表記なので、これを見てoverrideするとnull不可になってしまう。うっかり、null不可のままだと回転させるとアプリが落ちてしまう。回転させないと気が付かないので注意が必要である。

ちなみに、AndroidStudioの補完でoverrideするとnull可になるようだ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?