Android
はじめに Jetpack Composeは変更があった部分だけ、再計算(ReComposition) されます。どのようなときにReCompositionされて、どのようなときにCompositionがSkipされるのかを知っていると、最適なパフォーマンスを得られる手がかりになります。 Jetpack Comp…
派生Stateである DerivedState を作成する derivedStateOf の使い所についてです。 基本的な使い方 rememberの中で derivedStateOf を使います。その中で State を読み込みます。 これにより、 Stateの counter1 が変化した時にだけ計算が行われます。 var c…
とあるLambdaの中で読み込まれたStateObjectを把握します。 環境 Jetpack Compose Desktopですが、Androidでも動きは同じはずです。 Runtime 1.1 コード Snapshot.observe で読み込まれたStateObjectを把握する事ができます。 derivedStateOf の内部で使われ…
Composableの状態 Composable関数には3つの状態があります。 State1 State2 State3 skippable ○ restartable ○ ○ https://github.com/androidx/androidx/blob/403b6d0032c289ed6e65a1c75f137c07aedd220f/compose/compiler/design/compiler-metrics.md skippa…
LayoutInspectorを使って、Recomposeされているタイミングと場所を把握します。 LayoutInspectorを開きます。 設定 Show Recomposition Counts にチェックを入れます。 Show Recomposition Counts が無い場合は compose runtime のバージョンが 1.2 以上が必…
詳細な位置情報 ACCESS_FINE_LOCATION を取得しようとしても、 ACCESS_FINE_LOCATION ではなく、大まかな位置情報である ACCESS_COARSE_LOCATION が許可される場合があるので、しっかりチェックしましょう。 MainActivity.kt private val launcher = object …
以下のようなボタンを作成します。 四角の中がボタンが押せる範囲 rippleは円形の中だけ 実装 clickableの引数を見れば明確で、実装時に悩むことはありませんでしたが、以下のようにします。 interactionSource を共有し、rippleを表示させたくない範囲は in…
以前のAndroidでは、URLをアプリに設定するだけで、URLをタップするとアプリが開くように設定できました。 しかし、Android12からはiOSのように、Webサイト側に設定を行わないと自動でアプリが開かないようになりました。 https://developer.android.com/abo…
問題 Composeの1.1.0を使用するために、Kotlin1.5.21から1.6.10に変更した所、Jacksonのパースでエラーが発生するようになりました。 どうやら、Kotlin1.6ではkotlinx-metadataが0.2ではなく、0.3が必要なようです。 https://issuetracker.google.com/issues…
概要 CoordinatorLayoutのenterAlwaysを作成します。 必要なもの等 スクロールを検知して止めたりする レイアウトを移動させる 影の制御 Compose 解説は末尾でやります。 完成品 @Composable public fun HeaderEnterAlwaysColumn( modifier: Modifier = Modi…
ブートで固まって起動しない場合。以下を実行して再起動。 bcdedit /set hypervisorlaunchtype off 戻す場合 bcdedit /set hypervisorlaunchtype auto DockerやWSL2が使えなくなるところが痛い。通常はWindwos sybsystem for Androidが来たらそれを使って、…
はじめに 以下のコードではtry-catch構文は使用せず、runCatchingを使用しています。文章の中で出てくるrunCatchingはtry-catchと置き換えてもらって大丈夫です。 SupervisorJobを使用しないコード 以下のコードは特にエラーもなく動きます。 withContext im…
Target 仕事でアプリ開発をしている人 QAの工数がまだ取れないのでまだtargetSdkVersionが上げられない compileSdkVersionを上げよう 詳しくは全てここを読めばいいです。 https://medium.com/androiddevelopers/picking-your-compilesdkversion-minsdkversi…
テキストのベースラインとアイコン等を下部に揃えます。 ベースラインではなくて、ただ単純に要素の下部を揃えたい場合は Row(verticalAlignment = Alignment.Bottom) で十分です。 テキストのベースラインを揃える まずテキストのベースラインを揃えるには …
Usecase デザイン上、1行で表示させたいが、デバイスによっては横幅に収まらない。しかし改行をさせたくないものがあったので作りました。 上の様な感じではなく、下のように表示したい場合に使用します。 両方とも文字サイズ30spを使用し、表示できるデバイ…
env composeOptions { kotlinCompilerVersion "1.5.10" kotlinCompilerExtensionVersion "1.0.0-rc01" } code 2つ目のViewを押すと called が2回呼ばれています。 TestViewをRoot関数の外に出すと1回だけになりました。 何故か更新の無いはずのRowの最初のVi…
このような動的に変更されるtimeがあります。 class TagViewModel(private val coroutineScope: CoroutineScope) { val time: MutableStateFlow<String> = MutableStateFlow("") init { coroutineScope.launch(Dispatchers.Default) { while (isActive) { time.value</string>…
※追記 デバッグビルドと本番ビルド、端末ごとにパフォーマンスが大きく異る事がわかったので、パフォーマンスが悪いのはそれのせいかもしれません。(特に自分はPixel5でパフォーマンスが悪かったです。Pixel3は問題なかったですが。) 前提 rc01が出ています…
執筆日時 2020/12/31 更新: 2021/11/11 新しいWindowInsetsController ActivityのonResumeで以下の処理を行います。 window.insetsController?.hide( WindowInsets.Type.statusBars() .or(WindowInsets.Type.navigationBars()) ) window.insetsController?.s…
基本的にMutableStateFlow使っておけば良いと思いますが、LiveDataのように変更が無くても常に値を流したいという要件がありました。 以下のようなFlowが欲しい 最新の値を取得できる これは StateFlow の特徴ですね。 public interface StateFlow<out T> : SharedF</out>…
AndroidQからはファイルを保存してギャラリーで見るだけなら WRITE_EXTERNAL_STORAGE が必要ではなくなりました。 AndroidManifest Q(29)からは必要でない -> 28までは必要ということで、 AndroidManifest.xml で以下を指定します。 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28"/> https://developer.andr</uses-permission>…
startActivityForResult , onActivityResult は廃止されます。これに関しては既に内部的には ActivityResultContract 等を使用するように置き換えられています。 用途 Intentを作成して起動( startActivityForResult ) -> 結果を受け取るもの( onActivityRes…
デフォルトで横になる原因 AndroidManifestに定義されているから。
facebook SDKを含むAndroidアプリの依存を解決してみました。 省略 (*) 既に別の場所で出力されているので子の依存を省略 推移的依存解決 -> 別のライブラリ等の定義で新しい物が使用されていたのでそちらを使用する 出力された依存グラフ +--- com.facebook…
Androidは複数アカウントを持てたり、仕事用プロファイルがあったりします。Android Studio(adb install)ではデフォルトで全てのユーザーにアプリが入っていしまうので、コマンドで指定してインストールします。 ユーザー取得 adb shell dumpsys user | grep…
Java/Kotlinにて、テストとかで使うのではなく、ちょっとした確認でMockを使用したかっただけでした。それくらいでMockライブラリを入れるのが面倒だったので、ライブラリ無しでMockできないかを検討してみました。 1. Mockライブラリを調べる Mockライブラ…
前にこういう記事を書いてデバッグを加速させました。 【Android】Activityを開いたらLogcatにそのActivityへのリンクを表示する - アプリ開発備忘録 よく考えるとFragmentでもできるんじゃないか?と思い調べてみたらできました。 使用する機能 FragmentMan…
クラッシュログはコードジャンプでクラッシュ箇所に飛べて便利ですよね。その仕組みを自由に使用できないかなと色々調べた結果、正規表現でやっているらしく、特定の文字列を出力するだけでコードジャンプのリンクを生成できました。 文字列 リンクを表示す…
構築ガイド https://jitpack.io/docs/BUILDING/ main以外に好きな名前でモジュールを作成。 そのモジュールのbuild.gradleに以下を追加 apply plugin: 'maven' group = 'com.github.YourUsername' おしまい。
結論 module { viewModel { (savedState : SavedStateHandle) -> StateViewModel(savedState) } } class StateViewModel(savedState : SavedStateHandle) : ViewModel { } val viewModel by viewModel<StateViewModel> { parametersOf(Bundle) } parametersOfでBundleを渡す</stateviewmodel>…