こんばんわ。
前回に引き続き
市立図書館で借りた
を参考に
Androidプログラミングの独習を実施中。
またまた
2つ目の例題アプリで躓いた(´・ω・`)
アプリ名は「最強!?じゃんけんアプリ」
内容は、以下の通り
①メイン画面
「ぐー」「ちょき」「ぱー」の画像から自分の手を選択
②結果画面
①で選択したら、この結果画面に遷移。
コンピュータがある法則で出した「手」と
自分が選択した「手」と
勝った/負けた/あいこの情報が表示される
これまた、シンプルなアプリ。
しかしながら、またまた参考書との違いが出てしまった。
今回の躓いたポイントを以下で整理する。
1.Anko の非推奨
参考書では、AnkoというKotlinの拡張機能ライブラリを
導入する手順がまず記載されている。
しかしながら、このAnkoを導入しようとすると、
ビルド時点でエラーが発生する!?
なぜ?と調べてみたら、以下のような情報を発見した。
英語記事なので、翻訳しながら見てほしいが、
簡単にいうと
以下の理由からAnkoを非推奨としたらしい。
- GoogleがKotlinを正式サポートした
- Androidxなどが登場した
(Ankoに頼らずともいろいろできるようになった) - Anko自体も時代遅れとなってきた
とのこと。
最終的に
Ankoを導入しなくても同一機能のコードは記述できるので、
スルーでOK!
2.共有プリファレンスの導入
当アプリでは、データ保管(選択した手、前回の勝敗とか)を保存するために
共有プリファレンス(androidx.preference.PreferenceManager)を利用する。
しかしながら、いざimportしようとすると
自動補完がきかない!?
どうやらデフォルトでは、
対象ライブラリが導入されていないみたいだ(´・ω・`)
build.gradle(アプリ側)に
ライブラリの依存関係を追加することで、解決した。
dependencies { implementation 'androidx.preference:preference:1.2.0' ・・・ }
3.ビルド時「Duplicate class」エラー
一通り記述できて、よし、ビルドしよう、としたら、
以下のようなエラーが発生した。
Duplicate class androidx.lifecycle.ViewModelLazy found in modules lifecycle-viewmodel-2.5.0-runtime (androidx.lifecycle:lifecycle-viewmodel:2.5.0) and lifecycle-viewmodel-ktx-2.3.1-runtime (androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1) Duplicate class androidx.lifecycle.ViewTreeViewModelKt found in modules lifecycle-viewmodel-2.5.0-runtime (androidx.lifecycle:lifecycle-viewmodel:2.5.0) and lifecycle-viewmodel-ktx-2.3.1-runtime (androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1)
以下の2つのライブラリでクラスの競合(Duplicate)が発生している、、、らしい。
■対象ライブラリ
androidx.lifecycle:lifecycle-viewmodel:2.5.0
androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1
■重複クラス
androidx.lifecycle.ViewModelLazy
androidx.lifecycle.ViewTreeViewModelKt
実際に、プロジェクトツールウィンドウを
「Android」から「プロジェクト」に変更して
外部ライブラリの中身を確認してみると
下図のように、確かに、重複していた。
このクラス重複の回避方法について、
いろいろ調べたのだが、、、
なかなかよい解決策が出ない。
片方のライブラリだけ除外する、という記述を
gradleに書いてみたが、失敗。
どうしよう、と思っていたところ、
思い付きで、
依存関係を明示してみようと
gradle(アプリ側)に片方(今回は、lifecycle-viemodel-kt)の
依存関係を宣言してみた。
dependencies { implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1' ・・・ }
ビルドが通った!!!
問題なく、アプリも動いた!!!
こんな方法で行けるものだな、と思った。
ちなみに、入力したライブラリのバージョン(エラーメッセージと違う)は、
下図のように、自動補完で出たものをそのまま採用してみただけ。
以上、今回の実際にやってみたら
躓いたポイントでした~(^^)ノシ