前人未踏の領域へ Androidアプリ開発編

Androidアプリ開発に関する調査メモ置き場。古い記事にはアプリ以外も含まれます。

Apple Silicon版のAndroid StudioをToolbox Appで使えるようにする

課題 Apple Silicon版のMacBook Proの購入に伴い、Android StudioもApple Silicon版にしたいが、 できればJetBrainsのToolbox App経由で使いたい。どうすれば良いか。 対応 JetBrains Toolbox AppをApple Silicon版にする Toolbox上のAndroid Studioをアンイ…

M1 MacでRoomがビルドエラーになる

内容 M1 MaxなMacBook Proが我が家に届いた!ということで早速セットアップを行ったところ、プロジェクトがKaptのところでビルドエラーになる。 対応 参考URLによると、Roomのところでエラーになるらしい。ということでRoomのバージョンを最新の 2.4.0-beta0…

Android:デバイス情報のビルド番号に test-keys がついていた話

内容 先日サポートしているアプリにお問い合わせがあり、内容とは別にそのユーザーの端末のビルド番号が 機種ID.バージョン test-keys となっていた。機種名は一応伏せるがGoogleのPixel端末などではなくいわゆる中華端末である。 気になった点 署名 ビルド…

Android:SavedStateHandleでFragmentの引数をViewModelで受け取れるようになってた

追記 HiltViewModelを使うとActivity起動時に使われるIntentパラメータの値も下記記事と同様に ViewModelのSavedStateHandleにセットされていることを確認。 内容 Fragment 1.2.0 以降で利用可能になった SavedStateHandle を試しに書いてみたら いつもFragm…

Android:FragmentのライフサイクルとLiveData、Flowの関係

内容 LiveDataやFlowを使って値の変更をwatchするようになり、Fragmentのライフサイクルに対してどのタイミングで発動するのかが気になったので調べてみた。 結果 イベント タイプ onCreate Fragment launchWhenCreated Flow onCreateView Fragment onViewCr…

Kotlin:String.ifBlank{}が便利そう

AndroidStudioでリファクタリングのアシストが表示された。 文字列がblankの場合に特定の値を設定したい場合に param.q = if (query.isNotBlank()) { query } else { "hoge" } ifBlank()を使えば対象の文字列を代入しつつ、nullまたは空の場合にだけ代替の値…

Android:Jetpack Navigationでボトムナビのタブ切り替えでハマる

課題 Jetpack NavigationがBottomNavigationのMultiple BackStackに対応したとのことで喜んで実装してみたところ、 ボトムナビを切り替えてまた元の画面に戻った場合の挙動がおかしくなった。 原因 Jetpack Navigationでボトムナビの実装を行うと、ボトムナ…

Android:SVGでシンプルな図形を描く方法を知っておく

内容 ベクター画像をデザイナーさんからもらって使っているけれど、ちょっとしたものは自分で書いて済ませてしまいたい。そんな時に。 四角形 <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> </vector>

Android:ComposeのDeploy PreviewでPreviewActivity is not an Activity subclass or aliasになる

課題 Jetpack Composeの実装中、Deploy Preview で端末に特定のComposeをデプロイしようとしたところ、以下のエラーが発生してデプロイできない。 androidx.compose.ui.tooling.PreviewActivity is not an Activity subclass or alias ArcticFox 2020.3.1 Co…

Android:BottomNavigationViewに独自の画像をセットする

課題 マテリアルコンポーネントのBottomNavigationViewを使いたいが、一部のアイコンだけログインユーザーの画像にしたところ、すべてのタブに自動的にColorListが適用されてしまい画像が表示されない。どうすればよいか。 対応 BottomNavigationViewはタブ…

Android:既存アプリにMaterial Components Themeを段階的に適用する

課題 既存アプリでMaterial Components 対応をするため、テーマを適用してみた。 <style name="AppTheme" parent="Theme.MaterialComponents.Light" /> <style name="AppTheme.NoActionBar" parent="Theme.MaterialComponents.Light.NoActionBar" /> すると、ボタンやテキストボックスの色がまとめて違うものになってしまった。 全部を個別に対応するのは大変なので段階的に対応したい。どうすればよいか。 対応 Theme.Mate…

Android Studio:Bumblebee 2021.1.1 Canary 6 アップデートメモ

内容 Bumblebee 2021.1.1 Canary 6 がリリースされたのでアップデートしてみた。 変更したこと 各バージョンを更新(主要なもののみ記載) compileSdk => 31 targetSdk => 31 composeVersion => 1.0.1 kotlinVersion => 1.5.21 // compose-1.0.1のターゲット…

Android Studio:Bumblebee 2021.1.1 Canary 5 アップデートメモ

やったこと android gradle pluginを 7.1.0-alpha05 に更新 Hilt関連を 2.38.1 に更新 compileSdk,targetSdk を31に変更 課題 Bunblebee Canary 5にしたところ以下の問題が発生。 command+マウスクリックで宣言先に遷移できない コードアシストが発動しない …

Android Studio:Bumblebee Canary 4:バグ:変更が反映されない

問題 Run App でAndroid Studioからアプリ起動後、コードを修正して Run App しても内容が反映されない。 対応 Android Studioのバグ。 Canary3も動作がおかしいのでCanary2 まで戻して修正待ち。またはArctic FoxのRC1を使う 参考 https://issuetracker.goo…

Android Studio:Code Completionで大文字小文字を無視する

課題 Android Studioでコード補完(Code Completion)する際に大文字小文字が一致していないと補完してくれなくなった。どうすればよいか。 対応 Preferences -> Editor -> General -> Code completion -> Match Case をオフにする Match caseのチェックを外…

Android: HiltでFragmentをInjectionするとcontextの中身が変わる件

内容 Android開発時にFragmentにHiltの @AndroidEntryPoint アノテーションを付けてインジェクションを行った際、requireContextを呼んだ場合など context の中身が ViewComponentManager.FragmentContextWrapper になる。 これの何が問題かというと、これま…

Android:Jetpack ComposeがKotlin 1.5に対応

内容 Jetpack Composeはこれまで Kotlin 1.4.32が対応バージョンとなっていたが、1.0.0-beta09からKotlinの1.5.10に対応となったようだ。 android { buildFeatures { compose = true } composeOptions { kotlinCompilerVersion = "1.5.10" kotlinCompilerExt…

Android:Android Gradle pluginを7.0.0-beta03にしたら同期エラーになった

課題 Android Gradle pluginのバージョンを 7.0.0-beta03 にあげたところ、Gradle project sysnc faildが発生した。 エラーメッセージは以下のとおり Unable to find method ''void com.android.build.api.extension.AndroidComponentsExtension$DefaultImpl…

Android: Paging3:PagingAdapterのデータを空にする

課題 Paging3でデータをセットしたはいいが空にしたいときにはどうすればいいか。 データを空にする PagingData.empty() をsubmitDataに渡してあげればよい。 adapter?.submitData(lifecycle, PagingData.empty()) 参考 stackoverflow.com

Android: Kotlin1.5でkotlin.runCatching内でResultを使った際にClassCastExceptionが発生した

課題 APIのレスポンスを処理する際にkotlin.runCatchingを用いて結果をLiveData<Result>に格納しているが、まれにkotlin.runCatchingのブロック内で戻り値とは別にLiveDataにResultをセットすることがあった。 private val _hoge: MutableLiveData<Result<Hoge>> by lazy { Mutabl</result<hoge></result>…

Android: Intent.ACTION_MY_PACKAGE_REPLACEDを過信するべからず

課題 Room採用のためRealmDBからSQLiteにDBを移行するにあたり、BroadcastReceiverでIntent.ACTION_MY_PACKAGE_REPLACED イベントを受取って、そのタイミングでデータ移行プログラムを実行させるようにしたところ、一部の端末でデータが消えたとの報告があっ…

ViewPager2で操作性が悪化した件(その2)

内容 ViewPager2を導入したら子FragmentのSwipeRefreshLayoutによる縦スワイプ中にグラグラと横スワイプが発生するようになった。 対策 SwipeRefreshLayout自身のイベントリスナーなどを探すと存在せず、無駄に時間を浪費することになる。 正解(?)はSwipe…

IllegalStateExceptionが増えた件

内容 最近リリースしたアプリのFirebase Crashlyticsをみると IllegalStateException が妙に増加していた。 メッセージをみると XXXFragment not associated with a fragment manager が書いてあるんだけど、 なんでこのタイミングで起こるの?という感じの…

ViewPager2で操作性が悪化した件

FragmentStatePagerAdapterがdeprecatedになったのでViewPager2に移行作業中。 新しいFragmentStateAdapterからRecyclerView.Adapterを継承するようになったのだけど、 そのせいかPageコンテンツである子Fragmentの縦スクロール中に横スワイプが反応しやすく…

Jetpack Compose: Buttonを表示しようとすると落ちる

課題 Jetpack Composeでボタンを表示しようとしたが以下のエラーになってしまい表示できない。 NoSuchMethodError: No static method clickable Stacktraceはコピーするの忘れたのでありません。 対応 composeのバージョンが古い場合に発生。 自分の場合、1.…

Jetpack Compose: widthとpaddingの関係について

Jetpack Compseで Compsableにpaddingの挙動が気になったのでちょっと確認してみた。 @Preview(name = "PaddingとWidthの確認", showBackground = true) @Composable fun BoxPreview() { Surface( modifier = Modifier .padding(20.dp) .width(200.dp) .heig…

Android Studioでjlinkが見つからない件

課題 Android StudioのCanary版でJetpack composeを実装してビルドしようとしたところ以下のエラーに遭遇。 jlnkファイルがないと言われている。見ると確かに存在しない。 /Users/xxx/Library/Application Support/JetBrains/Toolbox/apps/AndroidStudio/ch-…

Jetpack Compose:アイコン付きテキストを作る

試行錯誤の記録。慣れるまでが一苦労。Android Studioのレイアウトエディターとか完全に無用の長物になってしまったな。 アイコン付きテキスト 左にアイコンがあってテキストが続くようなよくあるケース @Composable fun TextWithIcon() { Row(verticalAlign…

Retrofit:responseBodyがnullのsuspend関数を定義する

課題 Retrofit2でレスポンスが空のsuspend関数を定義したい場合、以下の書き方だとエラーになる。 suspend fun like( itemId:Int ) :Unit // 単にCallを外しただけだとNG。Void, Unit?も同様 <クラス名> was null but response body type was declared as no…

suspend関数を処理可能なラムダパラメータを定義する

タイトルも本文も何言ってるか分からないかもしれないけれどちょっと感動したので。 課題 ViewModel内の関数で、コルーチン内部でラムダを実行させたい。 このラムダは内部でRetrofitによるsuspend関数のAPI呼び出しを行うためsuspend関数の実行が必要である…