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

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

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

Fragmentから親ActivityのonActivityResultを呼ぶ

課題 Fragmentから親ActivityのonActivityResultを呼びたい。どうすればよいか。 対応 昔の実装見たら解決済みだったのだけど、あれ、どうやるんだっけ?となったのでメモ。 onActivityResultをpublicでoverrideする onActivityResultはprotectedで定義され…

Play Install Referrerをアップデートすると追加のパーミッションが要求されることがある

追記 この問題はInstall Referrerの 1.1.2 で解消されたらしい。まだ未確認だけどもう上げても大丈夫そう。 stackoverflow.com 課題 アプリをリリースしようとしたところ、 READ_PHONE_STATE が追加パーミッションとして要求されますと警告が出た。 原因 Pla…

WorkManager.getInstanceでIllegalStateException

課題 一部の端末(例えば Zenfone 3など) でアプリが起動しないという事象が発生している。スタックトレースを見るとWokrManagerのgetInstanceするところでクラッシュしていた。 Caused by: java.lang.IllegalStateException: at androidx.work.impl.WorkMan…

View Binding : includeしたファイルのViewが見つからない

課題 View Bindingを使ってみたが、include タグ以下のVIewの情報が取得できない。 原因 Includeファイルに対してidを指定していない。View Bindingはidを付与したものに対してしかコードを生成しない。 対応 includeファイルにidを付与すると、そのファイル…

setProguardSeedsConsumerメソッドが見つからない

問題 Android Studioから端末にアプリをインストールしようとしたところ以下のエラーが発生。 Unable to find method 'com.android.tools.r8.CompatProguardCommandBuilder.setProguardSeedsConsumer 原因 build.gradle にあるcom.android.tools.r8の設定が…

Android 3.6でビルドエラー

課題 Android3.6がβ版に昇格していたのでアップデートして起動したところ、Gradleのアップデート案内が通知されたので更新したらビルドが通らなくなった。 Gradle Pluginのバージョンを上げたのが原因らしい。 対応 とりあえず app/build.gradle の設定を順…

FragmentStatePagerAdapter

FragmentStatePagerAdapter(fm: FragmentManager)がdeprecatedになってた。 第2引数に BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT か BEHAVIOR_SET_USER_VISIBLE_HINT を 指定するらしいんだけれども BEHAVIOR_SET_USER_VISIBLE_HINT もdeprecatedになってる。…

Android 10 AppTask.moveToFrontが機能しない?

課題 ActivityManager.AppTask.moveToFront()メソッドは現在とは起動中のTaskをForegroundに持ってくるためのメソッド。 これがAndroid 10で機能しなくなっているかもしれない。 全くだめというよりは、うまく前に来ないような。すでに先頭にいるという扱い…

Figmaでコンポーネントを解除する

Figmaは慣れてくると超便利なんだけど、ComponentとFrameとGroupを理解しないと編集時にその便利さが享受できない。 課題 ComponentをFrameに変更したい 対応 Componentは直接は Uncomponent みたいなことができない。 Componentをコピーして同じ場所に貼り…

エミュレータにAPKをドラッグ&ドロップでインストールする

タイトルの通りなんだけど、Android Emulatorにapkがドラッグ&ドロップでインストールできるように なってた。PCからapkをエミュレータの画面上にドラッグするだけ あんまり使うことないかと思ってたけど偶然必要な機会があってやってみたら超簡単に入って…

R8でNullPointerException

課題 Android Stuio 3.5からはProguardよりもR8推奨ってことでR8を有効にした状態で リリースビルドをしようとしたらビルド中にNullPointerExceptionが発生してビルドできなかった。 対応 ググった感じだとOkHTTPを入れているとバージョンによっては発生する…

onActivityResultの呼ばれるタイミングとFragmentについて

課題 Fragment.onCreateViewでViewを生成しているが、onActivityResult内でそのViewを使用しようとした際にエラーになるケースがある。 原因 通常Fragment.onActivityResultはActivity.onStart前に実行され、それまでにはFragment.onCreateViewは既に実行さ…

dpに対応する実際のピクセルサイズを得る

課題 指定したdpサイズに対応する、端末の解像度に応じた実際のピクセルサイズが知りたい。 対応 dimens.xmlを使う。 <resources> <dimen name="user_icon">40dp</dimen> </resources> var size = context.resources.getDimensionPixelSize(R.dimen.user_icon) 関連 takerpg.hatenablog.jp

PicassoでWebP画像を表示する

課題 PicassoでWebP画像を表示したいが、WebPを表示するにはAcceptヘッダーにimage/webpが必要となる。どうすればよいか。 対応 OkHttpClientを作成し、Picasso.Builderを使ってdownloaderにセットする addHeaderの内容はChromeのデフォルト値に合わせてみた…

StethoでPicassoのデバッグを可能にする

課題 Picassoのリクエストヘッダーの内容をStethoで確認したい。 どうすればよいか。 対応 以下のような感じでPicassoの初期化メソッドを用意し、Applicationクラスなどから一度だけ呼んであげれば良い。 BuildConfig.DEBUG がtrueの場合のみ処理されるよう…

AdMobメディエーションリワード動画広告調査メモ

onRewardedイベントでは リワード typeとamountのみ。IDやどのリワード動画サービスかは分からない カスタムリワード動画以外はSDKが提供されているので基本設定で使う分には特殊な実装は不要 テスト時にはテスト端末登録が必要 テスト端末登録を行うとAdMob…

Firebase AnalyticsでBigQueryを使った場合の調査メモ

挙動に関して不明な箇所があったので実際にやってみたメモ DebugViewはユーザープロパティの削除が反映されない(BigQueryには反映されている) DebugViewはユーザープロパティの追加が反映されないことがある(BigQueryには反映されている) 連続して2つセ…

RecyclerView内のアイテムが表示されたタイミングを取得する

課題 RecyclerView内のあるViewTypeのアイテムが表示されたタイミングでImpressionイベントを計測したい。 対応 RecyclerView.Adapter.onViewAttachedToWindow() メソッドをオーバーライドする。 override fun onViewAttachedToWindow(holder: RecyclerView.…