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

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

twitter-kit-androidを使ってツイートしようとするとDM送信画面が起動する

内容 アプリからのツイートをtwitter-kit-androidライブラリを使って行っているが、最近TwitterアプリのDM送信画面が起動するようになったので調査する。 調査 TwitterアプリのIntentFilterを確認する ツイートにはIntent.ACTION_SENDを使用しているので、本…

Android: android gradle pluginを7.0.4から7.1.1にアップデートする

内容 少し前からGradle 7.1.1にアップデートしろとの案内が出ていたが、対応できずにいたものをまとめて対応。 同じようなタイミングでターゲットSDKも変えたのでもしかしたらそちらの影響もあるかも。 基本的にはUpgrade Assittantが勝手にやってくれるが、…

次期Android SDKはTiramisuに

Android 9.0 (Pie)以降、SDK Platformに名前がついていなかったが(あったのかもしれないが)Tで復活したようだ。 Tiramisuだそうな。勝手な予想だけど誰かの強い意志が働いてそうな気がするw ちなみにAndroid Studioにもアルファベット順にコードネームが…

Android StudioでViewBindingがRun App後にエラー表示される件

課題 アプリ開発でViewBindingを使っているが、Run Appしてアプリを実行したあとでエディタのViewBindingに関する部分がコンパイルエラー扱いになる場合がある。どうすればよいか。 対応 対応というか解決してないんだけど、とりあえずGradleと同期するとコ…

Android : bindingAdapterPositionとabsoluteAdapterPositionの違い

課題 RecyclerView.ViewHolderのgetAdapterPositionがdeprecatedになったので、getBindingAdapterPositionかgetAbsoluteAdapterPositionのどちらかに変更する必要がある。どちらを選択すればよいか。 結論 bindingAdapterPositionはadapterごとの位置情報を…

Android:Jetpack ComposeでNoto Sans JPフォントを使えるようにする

追記 Issueが解決され、記事になっていた。今後は includeFontPadding=falseがデフォルトで適用されるようになるため 本記事の問題は影響しなくなるだろう。 medium.com 課題 これまでアプリでGoogle FontsからNotoフォントをダウンロードして使っていたが、…

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の縦スクロール中に横スワイプが反応しやすく…