Translate

BTemplates.com

Powered by Blogger.

2018年2月10日土曜日

2018-02-10 到達点メモ


KotlinでDialogFlagmentをつかってダイアログを表示する機能を作っていたのだが
ダイアログのボタンを押すと以下のようなエラーが出た。

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState
 at com.nononagainfo.www.applimiter.FireMissilesDialogFragment.onCreateDialog(FireMissilesDialogFragment.kt)
 at android.app.DialogFragment.getLayoutInflater(DialogFragment.java:406)
 at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:995)
 at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1171)
 at android.app.BackStackRecord.run(BackStackRecord.java:815)
 at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1578)
 at android.app.FragmentManagerImpl$1.run(FragmentManager.java:483)
 at android.os.Handler.handleCallback(Handler.java:751)
 at android.os.Handler.dispatchMessage(Handler.java:95)
 at android.os.Looper.loop(Looper.java:154)
 at android.app.ActivityThread.main(ActivityThread.java:6184)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

なんじゃこりゃーといって、
DialogFragmentの定義部分で
val builder = AlertDialog.Builder(activity)
var builder = AlertDialog.Builder(activity)に変えたり
もしくは、ダイアログの呼び出し先で
val dialog =  SelectAppLimitDialogFragment()
var dialog =  SelectAppLimitDialogFragment()に変えたり
と無意味な事をしました。
そして、nullと呼び出されているから
dialog.show(fragmentManager,"test")を
dialog.show(fragmentManager!!,"test")に変更したりなど
冷静に考えれば意味が無いと気が付くような変な修正をしていました。

結局のところどう直せばよいかというと
override fun onCreateDialog(savedInstanceState: Bundle): Dialog を
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog に
修正すればよいという訳でした。
ようは、継承元がnullを許容する引数なのに、継承先がnullを許容しておらず
型が一致しないため、エラーが起きたのだと思われます。

前も同じような修正をしていた気がしたので
調べなおしたら見事にやらかしていた。
2017-11-10  到達点メモ
原因を特定するために参考にしたサイトも前と同じだったのは笑った。

このようなケースのミスはJavaからソースをKotlinに変換すると
起こりやすいミスな気がします。
前の失敗は、Javaのコードを変換した直後ですし
今回の件は、Javaのコードをコピペしたので可能性は高いと思っています。

参考サイト:KotlinでParameter specified as non-null is null

なお、DialogFragmentを作る際は以下のサイトを参考にした
参考サイト:ダイアログ(公式ドキュメント)
参考サイト:[Android] DialogFragmentを使ってダイアログを表示する
参考サイト:KotlinでDialogFragmentを使用する【Android】
参考サイト:コピペしてすぐ使えるアラートダイアログ集

あんまり進んでいないが、今日はここまで

0 コメント:

コメントを投稿