SEの徒然草

SEの徒然草

SEしています。タイトル通り、まぁ、雑多なジャンルについて、つれづれなるままに、投稿します。

Amebaでブログを始めよう!

こんばんわ。

 

前回に引き続き

市立図書館で借りた

『はじめてのAndroidプログラミング 第3版』

を参考に

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'
    ・・・
}

 

ビルドが通った!!!

 

問題なく、アプリも動いた!!!

 

こんな方法で行けるものだな、と思った。

 

ちなみに、入力したライブラリのバージョン(エラーメッセージと違う)は、

下図のように、自動補完で出たものをそのまま採用してみただけ。

 

 

 

以上、今回の実際にやってみたら

躓いたポイントでした~(^^)ノシ