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

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

Android

Jetpack Compose:TopAppBarとPullToRefreshContainerがうまく連動しない

課題 androidx.compose.material3:material3 を 1.2.0 にしたところ、TopAppBarとPullRefreshがうまく連動して動作しなくなった(TopAppBarDefaults.exitUntilCollapsedScrollBehaviorの場合に下にスクロールしてもTopAppBarが降りてこない)。どうすればよ…

Jetpack Compose:特定の条件のときだけClickableにしたい

内容 あるコンポーサブルをにclickable属性を付与したいが、条件によってはoffにしたい。 クリックイベントを空 {}にしてもタップエフェクトが発生してしまう。どうすればよいか。 対応 Modifier.clicable()のenabled パラメータを使う @Composable fun Some…

Duplicate class対応:Google Play Coreライブラリの分割

内容 androidx.navigation関連のライブラリを2.6.0にあげたところDuplicate classエラーが発生した。 > A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable > Duplicate class com.google.android.play.c…

PagingDataのテストデータを作成する

内容 Jetpack ComposeでPagingライブラリのレスポンスであるFlowを使ったComposableを Preview、テストしたい。どうすればよいか。 対応 Version 3.0.0-alpha04 から PagingData.from(List<T>) が使えるようになったのでこれを使う。 // 本の一覧があるとする v</t>…

BuildConfigが生成されない

内容 Android Gradle Pluginを8.0.0にアップデートとしたところ、BuildConfigの部分がコンパイルエラーになった。 コンパイル時にBuildConfigが生成してくれていないようである。 原因 BuildFeatures.ktを見るとbuildConfigのデフォルト値がfalseになってい…

Iconコンポーサブルをtintを指定せずに使いたい

内容 アイコンのSVGデータなのでIconコンポーサブルを使って表示したいが、SVGデータが2色以上になっていて、 Iconコンポーサブルを使うと1色になってしまい、正しく表示されない。どうすればよいか。 対応 tint(色付) をColor.Unspecified (不特定)にす…

Jetpack Compose:TextのmaxLines指定時に表示した文字列と隠れた文字列を知るには

内容 コンテンツをリスト表示する際に、記事などの長文を部分表示したい場合に maxLinesパラメータを使って表示を制限するが、現在どこまで文字列が表示されているかを知りたい。どうすればよいか。 対応 TextViewの場合にはTextUtils.ellipsize() という関…

Jetpack Compose:Snackbarの色を指定する

課題 Jetpack ComposeでSnackbarを表示しようとしたら想定とは違った色で表示された。色を指定するにはどうすればよいか。 対応 SnackbarではColorsで指定した色がデフォルトで使われるのでそれを変更する手もあるのだが、ちょっと加工して使われるので、こ…

Jetpack Compose:BOMによるバージョン指定

内容 Jetpack Compose関連のライブラリのバージョン指定をこれまで個別に行なってきたが、Firebaseと同様にBOM(Bill of Materials)が提供されるようになった。依存関係をカバーしてくれるので早速使っていきたい。 対応 基本となる設定を確認。既に書いて…

Firebase CrashlyticsのエラーがAndroid Studioで参照できるようになった件

内容 Android StudioのElectric Eelから、App Quality Insights で Firebase Crashlyticsに記録された内容が参照できるようになった。 対応 Android StudioにFirebase Crashlyticsで使っているアカウントでログインするだけ。既に別アカウントでログインして…

Android : Compose : TextStyleを効率的に定義する

課題 TextStyleを使って文字コードやフォントサイズ、色などを指定できるが、画面ごとに微妙に変わることがあり、その度にスタイルを作っていくと数が増え過ぎてしまう。どうすればよいか。 回答 TextStyle.copy()を使おう。 実践例 メインで使うテキストカ…

Android: Fragment内のComposeでスクロール位置を復元する

追記 新しい記事を書いたのでこちらをご参考ください。 takerpg.hatenablog.jp 内容 Fragment内に ComposeVIew を作成し、LazyColumn でリストを表示したが、画面遷移から戻るとスクロール位置が元に戻ってしまう。 どうすればよいか。 TODO まず、ComposeVi…

Android: RoomのアノテーションプロセッサをKSPに変更する

内容 Kaptに代わるアノテーションプロセッサとして登場したKSP。Roomが対応しているので適用する。 対応 app/build.gradleを編集する。 変更前 dependencies { val room_version = "2.4.2" implementation("androidx.room:room-ktx:$roomVersion") kapt("and…

Android: LazyColumn(LazyVerticalGrid)にヘッダー、フッターを表示する

内容 LazyColumnで一覧を表示する際にローディングのフッターを表示したい。どうすればよいか。 対応 LazyColumn、LazyVerticalGridなどで一覧を表示する場合、通常は各Scope関数であるitemsに一覧データを渡してアイテムごとに処理を行うが、単にLazyColumn…

Android: Twitterアプリ経由でログインできない(解決済み)

内容 Twitterアカウントでのログインを可能にしているアプリで、Twitterアプリのバージョンを 9.54.0-release.0 の場合に 認証トークンを取得できずにログインできなくなる。 対応 Twitterアプリのバージョンを 9.54.1-release.0 にアップデートする。 感想 …

Android: LazyVerticalGridでPaging3を使えるようにする

追記 https://developer.android.com/jetpack/androidx/releases/paging#1.0.0-alpha19 1.0.0-alpha19ですべてのLazyLayoutに対して利用可能な低レベルの拡張メソッドが提供されるようになっため、以下の対応はすでに不要となっている。 内容 LazyVerticalGr…

Android:desugar_jdk_libsを1.2.0に更新する

内容 com.android.tools:desugar_jdk_libsを1.2.0に更新したところ、以下のエラーに遭遇した。どうすればよいか。 Unsupported desugared library configuration version, please upgrade the D8/R8 compiler 対応 Android Gradle Pluginのバージョンを上げ…

Android:Compose:Modifier.weightについてのメモ

内容 Modifier.weightの使い方について迷った箇所があったのでまとめておく Modifier.weightの仕組み ある範囲内(Row, Columnなど)に並べられたComposableの幅を比率で確保するための仕組み weightを付けなかったComposableはそのまま描写される weightの…

Android:okhttp3で画像データ取得時にエラーが発生する

内容 Coilのバージョンを 1.4.0 から 2.1.0 に上げたところ、一部のバナー画像が表示されなくなった。 調査 エラーは以下のようなもので、レスポンスヘッダーのcontent-disposition に無効なキャラクタが含まれているようだ。filenameの「バナー」の部分だろ…

Android: WebViewで発生したエラー一覧

内容 WebViewでページをロードした際に WebViewClient.onReceivedError で拾ったエラーのリスト。 新しいものを見かけた場合には随時追加したい。 Description errorCode description 内容 -1 ERR_FAILED -1 ERR_HTTP2_PROTOCOL_ERROR サイトに接続できない …

Jetpack Compose : TextFieldにdisabledTextColorを適用するには

内容 TextFieldをdisabledな状態にしたい。どうすればよいか。 対応 enabledパラメータをfalseにする。基本はこれだけで、フォーカスが当たらなくなり、編集不可になる。 // 抜粋 TextField( enabled = false ) 色が変わるようにする enabled=falseになった…

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:Jetpack ComposeでNoto Sans JPフォントを使えるようにする

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

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でボトムナビの実装を行うと、ボトムナ…