AndroidXに対応しようとしてハマった話
Android Xは通常アップデートと異なり、かなり大掛かりなアップデートとなっていました。
今回はちょっとだけですが、対応した内容の話を記載しておきます。
目次
公式アナウンス
いつものことですが、Googleから公式のMigrateに関する記事が記載されていました。
この内容に従い gradle.properties ファイルに下記の記載を追加しましょう。
1 2 3 4 5 6 7 |
# Support Android X # AndroidXライブラリの使用を明言 android.useAndroidX=true # 既存サードパーティーを書き換え、AndroidXを使用するように設定 android.enableJetifier=true |
これで右上に出てくる Sync Now を押すと、大体エラーが出てきますので、Migrateをしていきましょう。
また、公式アナウンス内で記載されていますが Android Studio 3.2 以上 で実行する必要がありますので、古いAndroid Studioを使用されている方はまず、バージョンをアップしてからにしましょう。
余談ですが、公式アナウンスにある [Refactor] > [Migrate to AndroidX] でMigrateできる場合は特に必要ないかと思います。
経験上、自動Migrateでうまくいった試しがありませんが・・・。
プログラム・レイアウトを修正
今回対応しなければならなかったのは下記の内容です。
- 古いライブラリの削除
- AndroidXライブラリへの移行
順を追って説明していきます。
古いライブラリの削除
今回対応したアプリでは、下記のライブラリでエラーが発生していました。
- android.support.v7.app.AppCompatActivity
- android.support.v7.widget.RecyclerView
- android.support.v7.widget.Toolbar
- android.support.v7.widget.helper.ItemTouchHelper
- android.support.v7.widget.LinearLayoutManager
- android.support.constraint.ConstraintLayout
- android.support.design.widget.FloatingActionButton
- android.support.design.widget.Snackbar
- android.support.v4.app.ActivityCompat
- android.support.v4.app.DialogFragment
- android.support.v4.content.ContextCompat
- android.support.v4.content.ContextCompat.startActivity
- android.support.v4.content.PermissionChecker
- android.support.v4.widget.SwipeRefreshLayout
- android.content.pm.PackageManager
見るだけで頭が痛くなりますね・・・。
ではそれぞれの対応方法で説明します。
削除するだけで良いもの
- android.support.v4.content.ContextCompat.startActivity
- android.content.pm.PackageManager
後者の android.content.pm.PackageManager は、PermissionCheckerで使用していましたが、AndroidXでは別の場所でチェックを行うことになるので不要です。
ライブラリの場所が変わったもの
残ったものはすべてライブラリの場所が変わっていますので、順次対応していきましょう。
android.support.v7.app.AppCompatActivity →
androidx.appcompat.app.AppCompatActivity
android.support.constraint.ConstraintLayout →
androidx.constraintlayout.widget.ConstraintLayout
android.support.v7.widget.Toolbar →
androidx.appcompat.widget.Toolbar
android.support.v4.content.PermissionChecker →
androidx.core.content.PermissionChecker
android.support.v7.widget.LinearLayoutManager →
androidx.recyclerview.widget.LinearLayoutManager
android.support.v7.widget.RecyclerView →
androidx.recyclerview.widget.RecyclerView
android.support.v7.widget.helper.ItemTouchHelper →
androidx.recyclerview.widget.ItemTouchHelper
android.support.design.widget.FloatingActionButton →
com.google.android.material.floatingactionbutton.FloatingActionButton
android.support.design.widget.Snackbar →
com.google.android.material.snackbar.Snackbar
android.support.v4.app.ActivityCompat →
androidx.core.app.ActivityCompat
android.support.v4.content.ContextCompat →
androidx.core.content.ContextCompat
android.support.v4.widget.SwipeRefreshLayout →
androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android.support.v4.app.DialogFragment →
androidx.fragment.app.DialogFragment
これらの対応ですが 使用しているレイアウトファイル内に記載されているものも変更する必要がある ので気をつけましょう。
プログラムを直す
基本的に互換をもって実装されていますが、プログラムを一部治す必要がありましたので、その内容を記載します。
1 2 3 4 5 6 7 8 9 |
// OLD if(PermissionChecker.checkSelfPermission(applicationContext, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { } // NEW if(PermissionChecker.checkSelfPermission(applicationContext, android.Manifest.permission.ACCESS_FINE_LOCATION) == PermissionChecker.PERMISSION_GRANTED) { } |
1 2 3 4 5 6 7 8 9 10 11 |
// OLD this.floatingActionButton.visibility = if(0 < this.list.size) View.VISIBLE else View.GONE // NEW if(0 < this.list.size) { this.floatingActionButton.show() } else { this.floatingActionButton.hide() } |
レイアウトが綺麗に表示されない場合
今回対応したアプリでは、変更前まできれいに表示されていたはずが、何も表示されないという問題が発生しました。
原因は Constraintの指定を暗黙の了解にしていた です。
以前までは自動でレイアウトを判断して表示してくれていた機能で作成していたため、明示的に記載する必要がありましたので、その対応がありました。
これに気づくまで、かなりの時間がかかってしまいましたが、無事対応することができました。
さいごに
アプリのバージョンアップは時に大きな改修と時間を伴います。
発表当時は情報もなく、手探りで探すしかなく、そのOSのデバイスも無いことが多いですので、実は結構時間がかかります。
なんとか対応していきたいものですね。
- おすすめ記事
-
-
のえる2019.05.29
-
Googleによるマテリアルデザインの解説がすごい!
むー2016.06.08 -
Google謹製のFlutterの使い方(1)
のえる2018.12.20
-
POPULAR
のえる
Full-stack Developer