Qiitaの記事通りにアプリを作るはずが無限のバグを踏んで頓挫した
Kotlin, LiveData, coroutine なんかを使って初めてのAndroidアプリを作る(2)はじめてのLiveData を見ながらアプリを作って、これを踏み台に勉強を勧めていこうと思っていました。しかし、無限にハマり、頓挫したのでハマった点を以下に示していきます。
1.kotlinx がインポートできない(未解決になる)
これは kotlinuxをインポートする という記事を参考にしました。どうやら、app/build.gradleのpluginsという項目に id 'kotlin-android-extensions' を追記しないといけなかったみたいです。そして、Files -> sync project with gradle file をクリックし、無事にインポートできました。
2.editStepが見つからない、と言われる
記事にもありますが、import文を追加しても見つかりませんでした。これはどういうことかと探していると、どうやらviewオブジェクトのIDだったみたいです。
3.it.toString()でType mismatch: inferred type is String but Editable! was expected が出る
4.java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference する。これが全ての元凶となり、アプリ開発が頓挫しました。。。
エラー全文も後学のために残します。
I/Choreographer: Skipped 105 frames! The application may be doing too much work on its main thread.
I/OpenGLRenderer: Davey! duration=1818ms; Flags=0, IntendedVsync=117941398042622, Vsync=117943148042552, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=117943165014500, AnimationStart=117943165082700, PerformTraversalsStart=117943167550600, DrawStart=117943172112200, SyncQueued=117943191967500, SyncStart=117943201215800, IssueDrawCommandsStart=117943203408000, SwapBuffers=117943205894500, FrameCompleted=117943225871100, DequeueBufferDuration=423700, QueueBufferDuration=2643400, GpuCompleted=0,
I/OpenGLRenderer: Davey! duration=1882ms; Flags=0, IntendedVsync=117941398042622, Vsync=117943148042552, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=117943165014500, AnimationStart=117943165082700, PerformTraversalsStart=117943167550600, DrawStart=117943203272300, SyncQueued=117943203338800, SyncStart=117943248547300, IssueDrawCommandsStart=117943273176200, SwapBuffers=117943298150300, FrameCompleted=117943326225500, DequeueBufferDuration=477600, QueueBufferDuration=3176700, GpuCompleted=0,
I/AssistStructure: Flattened final assist data: 2808 bytes, containing 2 windows, 17 views
I/Choreographer: Skipped 34 frames! The application may be doing too much work on its main thread.
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 16557
java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
at layout.InputDialogFragment.onCreateDialog$lambda-0(InputDialogFragment.kt:27)
at layout.InputDialogFragment.$r8$lambda$yOcMeHHgRbYFbtp4LqnxCWahVcs(Unknown Source:0)
at layout.InputDialogFragment$$ExternalSyntheticLambda0.onClick(Unknown Source:4)
at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:174)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
I/Process: Sending signal. PID: 16557 SIG: 9
実際のコードはこちら。
class InputDialogFragment : DialogFragment(){
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val viewModel = ViewModelProviders.of(activity!!).get(MainViewModel::class.java)
val builder = AlertDialog.Builder(context!!)
val view = View.inflate(context,R.layout.dialog_input,null)
builder.setView(R.layout.dialog_input)
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton("toroku"){ _,_ ->
//val step = view.findViewById<View>(R.id.editTextNumber2).toString() // editTextNumber2.text.toString()
val step =editStep.text.toString() // kokoga NP
viewModel.inputStepCount.value = 345 //step.toInt()
}
return builder.create()
//return super.onCreateDialog(savedInstanceState)
}
}
うまく行ってるコードはQiitaの途中にあるので見比べました。すると、editStepの前に、view. がありましたので入れてみました。すると、ヌルポはなくなりましたがこんなエラーが・・・
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 17388
java.lang.NumberFormatException: For input string: ""
at java.lang.Integer.parseInt(Integer.java:627)
それならtoIntをわざわざ使わずStringで渡してしまえば、と思ってIntをそれぞれStringに変えると、下のようなエラーが・・・。
/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 17638
java.lang.IllegalStateException: Could not find method sendMessage(View) in a parent or ancestor Context for android:onClick attribute defined on view class androidx.constraintlayout.widget.ConstraintLayout
at android.view.View$DeclaredOnClickListener.resolveMethod(View.java:6302)
at android.view.View$DeclaredOnClickListener.onClick(View.java:6259)
at android.view.View.performClick(View.java:7448)
あ、ちなみに記事通りにテキストをセットする(MainActivity.kt)と下のようなエラーが出ました。Type mismatch.Required:Editable! Found:String
次は、
val step = view.editStep.text.toString()
val test = step
viewModel.inputStepCount.value = test + "de"
としてみました。この結果は、
もうこれはFragment中で入力したデータが持ってこれてないってことですね…。理由はわからないので一旦お手上げです。誰か助けてください
この記事が気に入ったらサポートをしてみませんか?