アプリ開発備忘録

PlayStationMobile、Android、UWPの開発備忘録

Android

SupervisorJobは基本必要が無いのではないかと思っている

はじめに 以下のコードではtry-catch構文は使用せず、runCatchingを使用しています。文章の中で出てくるrunCatchingはtry-catchと置き換えてもらって大丈夫です。 SupervisorJobを使用しないコード 以下のコードは特にエラーもなく動きます。 withContext im…

targetSdkVersionをアップデートする前に先にcompileSdkVersionだけ上げませんか

Target 仕事でアプリ開発をしている人 QAの工数がまだ取れないのでまだtargetSdkVersionが上げられない compileSdkVersionを上げよう 詳しくは全てここを読めばいいです。 https://medium.com/androiddevelopers/picking-your-compilesdkversion-minsdkversi…

【Jetpack Compose】テキストのベースラインとその他の要素の下部を合わせる

テキストのベースラインとアイコン等を下部に揃えます。 ベースラインではなくて、ただ単純に要素の下部を揃えたい場合は Row(verticalAlignment = Alignment.Bottom) で十分です。 テキストのベースラインを揃える まずテキストのベースラインを揃えるには …

【Jetpack Compose】横幅に応じてLayoutをScaleさせる

Usecase デザイン上、1行で表示させたいが、デバイスによっては横幅に収まらない。しかし改行をさせたくないものがあったので作りました。 上の様な感じではなく、下のように表示したい場合に使用します。 両方とも文字サイズ30spを使用し、表示できるデバイ…

【Jetpack Compose】@ComposableをInner関数で使用しないほうが良い

env composeOptions { kotlinCompilerVersion "1.5.10" kotlinCompilerExtensionVersion "1.0.0-rc01" } code 2つ目のViewを押すと called が2回呼ばれています。 TestViewをRoot関数の外に出すと1回だけになりました。 何故か更新の無いはずのRowの最初のVi…

【差分計算の仕組み】@Composableの引数にListを取ると差分計算がされない。 【Stable, Immutable】

このような動的に変更されるtimeがあります。 class TagViewModel(private val coroutineScope: CoroutineScope) { val time: MutableStateFlow<String> = MutableStateFlow("") init { coroutineScope.launch(Dispatchers.Default) { while (isActive) { time.value</string>…

【Android】Jetpack Composeの画像読み込みと加工のバットプラクティス

ネットワークからの画像読み込みと画像加工のベストプラクティス 前提 rc01が出ていますが、プレビュー用のライブラリのパッケージが移動して、Android Studioがプレビューに対応していない為、 1.0.0-beta09 を使用しています。 implementation "com.google…

【Android R(30)】全画面表示の方法【Compatあるよ】

執筆日時 2020/12/31 新しいWindowInsetsController ActivityのonResumeで以下の処理を行います。 window.insetsController?.hide( WindowInsets.Type.statusBars() .or(WindowInsets.Type.navigationBars()) ) window.insetsController?.systemBarsBehavior…

【好きなFlowを作成する】LiveDataのような挙動の上位互換のFlowを作成する

基本的にMutableStateFlow使っておけば良いと思いますが、LiveDataのように変更が無くても常に値を流したいという要件がありました。 以下のようなFlowが欲しい 最新の値を取得できる これは StateFlow の特徴ですね。 public interface StateFlow<out T> : SharedF</out>…

Android Qからの画像保存

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

【Android】ActivityResultContractってなんだ

startActivityForResult , onActivityResult は廃止されます。これに関しては既に内部的には ActivityResultContract 等を使用するように置き換えられています。 用途 Intentを作成して起動( startActivityForResult ) -> 結果を受け取るもの( onActivityRes…

【Android】zxing-android-embeddedで縦画面で起動する。

デフォルトで横になる原因 AndroidManifestに定義されているから。

gradle dependencies treeの読み方

facebook SDKを含むAndroidアプリの依存を解決してみました。 省略 (*) 既に別の場所で出力されているので子の依存を省略 推移的依存解決 -> 別のライブラリ等の定義で新しい物が使用されていたのでそちらを使用する 出力された依存グラフ +--- com.facebook…

【仕事用プロファイル】ユーザーを指定してアプリをインストールする

Androidは複数アカウントを持てたり、仕事用プロファイルがあったりします。Android Studio(adb install)ではデフォルトで全てのユーザーにアプリが入っていしまうので、コマンドで指定してインストールします。 ユーザー取得 adb shell dumpsys user | grep…

Javaで外部ライブラリなしでMockをする

Java/Kotlinにて、テストとかで使うのではなく、ちょっとした確認でMockを使用したかっただけでした。それくらいでMockライブラリを入れるのが面倒だったので、ライブラリ無しでMockできないかを検討してみました。 1. Mockライブラリを調べる Mockライブラ…

【Android】Fragmentを開いたらLogcatにそのFragmentへのコードリンクを表示する

前にこういう記事を書いてデバッグを加速させました。 【Android】Activityを開いたらLogcatにそのActivityへのリンクを表示する - アプリ開発備忘録 よく考えるとFragmentでもできるんじゃないか?と思い調べてみたらできました。 使用する機能 FragmentMan…

【Android】Activityを開いたらLogcatにそのActivityへのリンクを表示する

クラッシュログはコードジャンプでクラッシュ箇所に飛べて便利ですよね。その仕組みを自由に使用できないかなと色々調べた結果、正規表現でやっているらしく、特定の文字列を出力するだけでコードジャンプのリンクを生成できました。 文字列 リンクを表示す…

jitpackを使ってAndroidライブラリを公開する

構築ガイド https://jitpack.io/docs/BUILDING/ main以外に好きな名前でモジュールを作成。 そのモジュールのbuild.gradleに以下を追加 apply plugin: 'maven' group = 'com.github.YourUsername' おしまい。

koinでSavedStateHandleを使用する。

結論 module { viewModel { (savedState : SavedStateHandle) -> StateViewModel(savedState) } } class StateViewModel(savedState : SavedStateHandle) : ViewModel { } val viewModel by viewModel<StateViewModel> { parametersOf(Bundle) } parametersOfでBundleを渡す</stateviewmodel>…

ViewBindingUtil+Kotlin Delegationを公開しました。

ViewBindingUtilを公開しました。 DataBindingのようなDataBindingUtilが無いので作りました。 DataBindingUtil DataBindingUtil | Android Developers ViewBindingUtil DataBindingと違ってViewBindingはViewDataBindingとかを継承していないのでリフレクシ…

【Android】ViewBindingの使用から応用

ViewBindingがもうすぐStableになるので使用してみました。ActivityやFragmentの最新版との組み合わせを書いていきます。 公式ドキュメントはこちらになります。 https://developer.android.com/topic/libraries/view-binding 使用準備 build.gradleにViewBi…

Bitmapから暗黙的Intentでのシェアまで

Android Q時点のコードです。 Bitmap->Uri class ImageRepository( private val application: Application ) { private val IMAGE_PATH = "image" private val imagePath = application.getFileStreamPath(IMAGE_PATH).apply { // シェアのために一時的に保…

【Android】Room 2.1の更新点

I/Oセッション youtu.be Coroutineのサポート 関数にsuspendと付ける事でCancelableなコードが生成されるようになります。 全文検索のサポート SQLiteの拡張機能である、全文検索を利用できるようになります。 EntityにFTS4拡張と使用することを書きます。 …

Android Studio 3.5からのDataBindingの進化、3.6からのViewBinding

Viewへのアクセス方法が進化していきます。 I/Oセッション youtu.be DataBinding Annotation Processingの速度が20%向上 Incremental Annotation Processing android.databinding.incremental=true で増分コンパイルが有効化される。 XMLの即時反映 XMLに追…

【Android】SavedStateHandleでViewModelをプロセスキルを乗り越えるようにする

I/Oセッション youtu.be ViewModel このようなカウントするLiveDataがあります。 class MainViewModel : ViewModel() { val counter = MutableLiveData(0) } 押したら1増やします。 ViewModelを使用すれば画面回転を乗り越えられます。 当たり前ですが、プロ…

【Android】DerInputStream.getLength(): lengthTag=109, too big.

DerInputStream.getLength(): lengthTag=109, too big. にてビルドはできるものの署名ができず、インストールできない。 AndroidXへ移行した際に発生した。ただ、環境によっては問題が出なかったので関係あるか不明。 gradle-4.10.1→gradle-4.10.2にすること…

【Android Q】Beta2→3 READ/WRITE_EXTERNAL_STORAGEの復活

以下が消えて - READ_EXTERNAL_STORAGE - WRITE_EXTERNAL_STORAGE 以下が出てきたが - READ_MEDIA_IMAGES - READ_MEDIA_AUDIO - READ_MEDIA_VIDEO 「READ_EXTERNAL_STORAGE」、「WRITE_EXTERNAL_STORAGE」が復活した。 ただ、Scoped Storageが宛先になるよう…

【Android】PreviewのVERSION_CODESとSDK_INT

VERSION_CODES AndroidQ Preview2のコード public static class VERSION_CODES { public static final int BASE = 1; public static final int BASE_1_1 = 2; public static final int CUPCAKE = 3; public static final int CUR_DEVELOPMENT = 10000; publi…

【Android】リソースのプレフィックスをモジュールごとに強制する

モジュールが違っていてもリソースIDは被ってはいけない。 モジュールが違えばレイアウトID(ファイル名)を被らせる事はできてしまう。 以下をGradleに記述する事で警告を出す事ができる。 android { resourcePrefix 'modulename_' } たまたまHyperionのバグ…

【Android】CustomViewでPreviewが正常に生成されない場合に

CustomViewを作ったことがある、更にCustomViewの中でonDrawなどを書いた事があればわかるのですが、その内容はレイアウトエディタに反映されます。addViewしても反映されます。つまりAndroidStudioがCustomView内の処理を走らせてレイアウトや装飾を確認し…