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

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

Android

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: 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…

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関数の実行が必要である…

Kotlin : 代入とgetterと by lazy

課題 こんなコードがあったとして // 1 getter val nickname: String? get() = _user.value?.nickname // 2 代入 val nickname: String? = _user.value?.nickname // 3 by lazy val nickname: String? by lazy { _user.value?.nickname } // 4 関数 fun nick…

Android: BundleにEnumをセットする

課題 画面間の値渡しでBundleにEnumの値をセット、取得したい。どうすればよいか。 対応 EnumはSerializableなので Bundleの putSerializable メソッドが使える。 enum class Mark { HEART, SPADE, DIAMOND, CLUB } fun newInstance(): CardFragment { retur…

Android: 追加のJava言語APIサポート(Java8)

Android Gradle Plugin を4.0.0以上にするとD8/R8のDesugaringによってほぼすべての端末でJava8の追加APIが利用できるようになりますよ、という記事。 medium.com 設定は以下の通り。coreLibraryDesugaringEnabled と coreLibraryDesugaring を追加すれば良…

Android constraintlayout.widget.GroupのメンバーViewに個別のvisibilityが効かない

課題 Viewの表示・非表示を一括で管理するために androidx.constraintlayout.widget.Group でVIewをまとめたところ、そのGroup内のViewに対して 個別のVisibilityを設定しても反映されなくなった。 対応 Groupを使うのを諦め、ViewGroupで囲んでしまうのが無…

Android: ViewBindingでViewHolderの記述をシンプルにする

課題 これまでButterKnifeを使ってFragment及びViewHolderのView操作を記述してきたが、ViewBinding登場に伴いButterKnifeはdeprecatedになった。 ViewHolderをViewBindingを使って書き換えたいが、どうすればよいか。 対応 user.xmlとかいうユーザー一覧の…

Android: ViewModelのSavedStateHandleについて

課題 ViewModelのSavedStateHandleの特性について知りたい 結論 SavedStateHandleはプロセスがKillされた場合に状態が保持される アプリを正常終了した場合は状態がクリアされる SharedPreferenceの代替とはならない 調査 ViewModelの作成 まずViewModelを作…

Android Studio 4.1 Beta 1に上げる際にビルドできなくなる

課題 Android Studio 4.1 Beta 1がリリースされたため早速ダウンロードして起動してみたところ、 以下のエラーが出てビルドできなくなった。 Gradle sync failed: No such property: scope for class: com.android.build.gradle.internal.variant.Applicatio…

Android: LiveDataでオブジェクトのプロパティの変更を監視する

課題 UserをViewModelにLiveDataとして設定したが、Userオブジェクトのプロパティの変更を知りたい。どうすればよいか。 対応 LiveDataはvalueに値が代入されたタイミングでないとObserverに伝えてくれない。 参考サイトにはいくつかの対応案があるが、LiveD…

Android JetBrains Toolbox Appのススメ

Toolbox Appとは ご存知の方も多いかもしれないが、Android StudioはJetBrainsの製品をベースに開発されている。 そのJetBransには多くの言語をサポートするためのそれぞれのIDE製品を提供しており、それらのIDEを管理するために Toolbox Appというものも出…

Android:Email送信時にEXTRA_SUBJECT、EXTRA_TEXTが反映されない

課題 これまで以下のような感じでメールを送信していたが、いつ頃からか'EXTRA_SUBJECT', 'EXTRA_TEXT'がGmailにセットされなくなった。 /** * メール送信用Intentを生成する */ fun getMailIntent(mailTo: String, subject: String, body: String): Intent …

Android 10以降でアプリシェア時にEXTRA_INITIAL_INTENTSが機能しない

課題 コンテンツのシェア機能利用時に Intent.createChooser したIntentに対し、EXTRA_INITIAL_INTENTS で ターゲットアプリごとに特別にカスタマイズしたLabeledIntentを渡していたが、Android10端末でシェア対象のアプリが数件しか表示されなくなった。 原…

メアド、パスワードの入力候補を無効化したい

課題 Androidの8.0からAutofill機能が追加され、メアドとパスワードを記憶、自動セットしてくれるようになったが、 新規入力画面ではメールアドレス、パスワードの保管を無効化したい。どうすればよいか。 対応 importantForAutofill を no にする <TextView android:importantForAutofill="no" /> 逆に yes</textview>…