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

画像1

次は、

val step = view.editStep.text.toString()
val test = step
viewModel.inputStepCount.value = test + "de"

としてみました。この結果は、

画像2

もうこれはFragment中で入力したデータが持ってこれてないってことですね…。理由はわからないので一旦お手上げです。誰か助けてください


この記事が気に入ったらサポートをしてみませんか?