スマホアプリ開発つまずきポイント:RecyclerViewの使い方~金宏和實「作ればわかる!Androidプログラミング」

  金宏和實著「作ればわかる!Androidプログラミング」で、スマーホアプリを勉強中です。最新版で対応していない部分について、修正方法を記します。
 今回は、第10章で発生した、RecyclerViewに関わる不具合です。

 ※使用環境:2021年12月時点(Android Studio Arctic Fox 2020.3.1 Patch 4)


★Kotlinバージョンアップで、プログラムが動かない!
スマホアプリの作成に挑戦中です。以下の書籍に沿って、学んでいます(購入時の記事は、→こちら)。
・金宏和實著:作ればわかる!Androidプログラミング・Kotlin対応~10の実践サンプルで学ぶAndroidアプリ開発入門、2019/6、翔泳社
20211209za01.jpg

 開発環境の導入から、プログラミング、実機への導入まで、ひととおりの手順が書かれていて、とても分かりやすく実用的な書籍です。ただ、残念なことに、一部のソースコードが、そのままでは動きません。2019年6月の発刊であり、現在までに開発言語「Kotlin(コトリン)」が何度もバージョンアップされていることが原因です。

 2021年12月時点の環境(Android Studio Arctic Fox 2020.3.1 Patch 4)で動作するように、修正をしながら試しています。解決した部分は、当ブログに書きます。同様のエラーでお困りの方に、お役に立てば幸いです。(勉強中の人が書いています。ご指摘などありましたら、ぜひコメントください。)


★第10章:RecycleViewとRealm ~前編~

◎不具合発生箇所
・対象コード:第10章 各コード

◎発生状況
・エディタで作成時、数か所にエラーが指摘される。
・ビルドのとき、数個のエラーが発生する。
・実機で起動しても、データが表示されない。
・実機でデータを登録しようとすると、強制終了する。

◎原因
・バージョンアップによる仕様変更が原因と推察。

◎対策
 以下2カテゴリの修正が必要です。
1)レイアウトに関する修正
2)RecyclerViewに関する修正
3)Realmに関する修正

 分量が多いため、今回は1)と2)までの修正内容を示します。


1)レイアウト
 まず最初に、レイアウトです。出版時に比べて、「Basic Activity」で生成される内容が異なっています。「Component Tree」を操作して、不必要な要素を削除する必要があります。まずは「content_main.xml」を編集します。Component Treeを見ると、デフォルトで<nav_host_fragment_content_main>という要素があるので、これを削除します(選択→右クリック→削除)。
 そのあとで、テキストp.275の通り「recyclerView」を配置してください。配置後が下図です。
20211216z10r902.jpg

 次に「activity_main.xml」を表示します。下図のように、上で設定した「content_main.xml」の内容が埋め込まれているはずです。
20211216z10r901.jpg

 「activity_main.xml」で、fabにエラーが出ています。「contentDescription」に値を設定することで解消しました(下図。textの設定と同様に、Resource画面から設定する)。
20211216z10r821.jpg

 テキストp.285~にしたがい、「activity_edit.xml」を作成します。ここでもエラーがあります。3つの「EditText」(最高・最低・脈拍)に、名称を設定する必要があります。「hint」の欄に値を設定しました(下図)。
20211216z10r811.jpg
 
 最後に、RecycleView用のファイルレイアウトです。「one_result.xml」として、テキストp.291~で作成します。ここでは、Component Treeから「ConstraintLayout」(ツリーの一番上)を選び、Attributesを編集します。「layout_height」を「wrap_content」とします。ここは、エラーは出ませんが、修正しないと、1データが画面いっぱいに表示されてしまいます。
20211216z10r831.jpg


2)RecyclerView
 RecyclerViewの実装に関しては、以下2カテゴリの修正が必要です。
①build.gradle(app)のdependencies
②Android拡張プラグイン廃止への対応

◎gradleファイル
 まず、①です。書籍のp.278 リスト10.2について、下図赤枠部分の修正を要します。書籍の「com.android.support:recyclerview-v7:28.0.0」は、現在は使えません。「androidx.recyclerview:recyclerview:1.2.1」とします。(ハイライトされてバージョン更新を促されたときは、示された最新バージョンの値を使います。)

implementation 'androidx.recyclerview:recyclerview:1.2.1'

20211216z10r112.jpg


◎Kotlin拡張プラグイン:MainActivity
 ②のAndroid拡張プラグイン廃止への対応です。以前の記事(→こちら)の通り、「Android-Kotlin拡張プラグイン:kotlinx.android.synthetic...」は、現在使用不可です。代わりに「binding(バインディング)」を使います。

 まず、「MainActivity.kt」の冒頭(p.284)は、以下のように修正します。ActivityMainBinding型の変数bindingを定義して、これを使って各View(ボタンなど)を参照するようにします。例えば、テキストで「fab」とあるところを、「binding.fab」と書き換えます。
private lateinit var binding: ActivityMainBinding
...
binding=ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
setSupportActionBar(binding.toolbar)
...
binding.fab.setOnClickListener{ view->
...

20211216z10r201.jpg

 同じく「MainActivity.kt」の、p.297で記載する部分です。こちらは、「binding=ContentMainBindng...」のようにしても、うまく処理できません(エラーは出ないが、実行時にViewが更新されない。includeされたxmlだからか?)。代わりに、下図のように「findViewById」を使います。
val recyclerView= findViewById<RecyclerView>(R.id.recyclerView)

20211216z10r202.jpg


◎Kotlin拡張プラグイン:EditActivity
 「EditActivity.kt」(p.288~)は、bindingで対応できます(下図)。bindingの参照が「ActivityEditBinding」になることに、注意して下さい。「saveBtn」「maxEdit」などの各ボタン・ボックス類は、bindingで参照します。
private lateinit var binding: ActivityEditBinding
...
binding=ActivityEditBinding.inflate(layoutInflater)
setContentView(binding.root)
...
binding.saveBtn.setOnClickListener{
...
if(!binding.maxEdit.text.isNullOrEmpty()){
    max=binding.maxEdit.text.toString().toLong() }
...

20211216z10r304.jpg

 同「EditActivity」の、p.300~で修正する部分も、bindingを使った修正が必要です(下図)。なお、下ソースでは「delBtn」となっていますが、テキスト記載では「deleteBtn」です(当方作成のレイアウトで別名を使ってしまったため)。
...
binding.maxEdit.setText(bloodPress?.max.toString() )
...
binding.delBtn.visibility=view.VISIBLE
...
binding.delBtn.setOnClickListener{
...

20211216z10r981.jpg
※binding.delBtn.setOnClickListner{ は、上リストの続き(書籍p.301、③)にあります。

◎Kotlin拡張プラグイン:ViewHolder
 続いて、ViewHolderを定義する「ViewHolder.kt」です。ここはクラス定義なので、bindingが使えません。「findViewById」で参照します(下図)。
dataTxt=itemView.findViewById(R.id.dataTxt)
...

20211216z10r701.jpg

 なお、bindingの使用のためには、gladleファイル(app)で、bindingを有効にする設定が必要です。新規プロジェクト作成で「Basic Activity」を選んだときは、gradle(app)に、最初から以下の記述が入っています。すなわち、bindingが有効です。
buildFeatures{
    viewBinding true
}

20211216z10r151.jpg


 これで、RecyclerView関連の修正は完了です。しかし、まだRealmが動きません。

続きます。

Comments

Popular posts from this blog

Privacy Policy: LifePointer - a life counter for TCGs

Privacy Policy: Absolute FFT - visualize frequency of sounds

Privacy Policy: Head or Tail? - An App for Tossing Coins