画面を回転させると、アプリが落ちる
回転させると、
--------- 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可になるようだ。