Androidアプリ開発の覚書き

Androidアプリ開発を、Kotlin, Jetpack Composeで行っています。気になったことをChatGPTに聞いて記事にしています。

Excelのような編集可能な表を表示する(Jetpack Compose)

LazyColumn, LazyRow, TextFieldといった基本コンポーネントを並べて表示するというごくごく標準的な方法を教わりました。 ただ、その中で、数値のフォーマットや、列幅の調整等の実装を記述する必要があり、結果的にJetpack Composeでの基本的なコンポーネ…

Androidシステムの詳細について聞いてみました

Android OS自体についてや、アプリケーションの実行環境、アクセス制御、root化の方法などについて、詳しく聞いてみました。 Android OSとLinuxとの関係を教えてください。 AndroidとJVMの関係についても教えてください。 Ahead-of-Time (AOT) コンパイルに…

Kotlinで正規表現を利用した文字列操作を行う

正規表現の基本的な構文については、Rubyの例ですが、別ブログで詳細に述べています。 Kotlinでは、正規表現クラスRegexのインスタンスメソッド、find(), findAll(), replace()を用います。 Javaのように、replace(), replaceAll()の区別はありません。 repl…

Exposed:KotlinのORMライブラリ

Exposedは、JetBrainsによって開発されたKotlin専用のORMライブラリとのことです。 Android以外の環境であって、Roomが使えない場合に使いたいと思いました。 kotlinのORMライブラリで、定番で軽量のものがあれば教えてください。 Exposedの歴史と、他の類似…

関数型プログラミングの基本;Ktor

ふと、「再帰」のことが気になり、ChatGPTにいろいろ聞いていたところ、KotlinのWebサーバーフレームワークKtorの使い方の話に行き着きました。 Kotlinでコードを書く際は特に関数型プログラミングの知識が必須というわけではないのですが、徹底しようと思え…

Jetpack Compose:一覧画面と詳細画面;データ保持戦略

一覧画面と詳細画面の2つをもつJetpack Composeアプリケーション作成の実践例です。 構成変更時、一時停止時、システムによる強制終了時をまたいだデータ保持戦略についてもいろいろ聞いています。 Jetpack Composeで、2つの画面のあるページを作りたいです…

ログの取り方;デバッグビルド vs. リリースビルド

android.util.Logを用います。 Android, Kotlinで開発を行う場合のログの取り方の標準的方法を教えてください。 ログレベルの使い分けの指針、及び、設定ファイル等を用いたログレベル設定について、標準的方法があれば教えてください。 buildConfigFieldと…

Kodeinの疑問点: DI vs. Kodein; KodeinAwareの使い方

Kodeinの使い方でよく分からないものについて聞いてみました。 Kodeinのオブジェクトで、DI{..}で生成されるものとKodein{..}で生成されるもので違いはありますか? あと、KodeinAwareインターフェースの使い方も教えてください。 import()はKotlinの標準ラ…

Kotlinの依存性注入ライブラリKodeinの具体例と実装

「JavaのSpring Frameworkのようにアノテーションを用いないから、実行時に依存性解決を行っている」と勘違いしていましたが、実行時に依存性を解決するのはSpringも同じということです。 アノテーションの情報を実行時に、クラスのメタ情報として参照して挙…

CSVの読み書き:kotlinx.serializationを用いる

kotlinx.seriarization便利ですね。KotlinのデータクラスをJSONで読み書きする場合だけでなく、CSVで読み書きする際にも使えるようです。 ただし、ヘッダを自動的に入出力する機能は無いようです。 データをCSVの行にあたる文字列に変換する際にserializatio…

Jetpack ComposeのUIのテスト(詳細)

Jetpack ComposeのUIのテストについてかなり詳しく聞きました。 よく分かりませんでしたが、ドラッグアンドドロップのような複雑な動作もテストできるようです。 Jetpack Composeのテストについて、createComposeRule() が返すオブジェクトを用いてできるこ…

Mockito:Kotlinテストでモックオブジェクトを用いる

KotlinでMockitoを使う方法を詳しく聞いてみました。 Kotlinのクラスはデフォルトでfinalクラスであるため、通常のクラスはMockitoで扱えません。そこで、依存関係をmockito-coreに代えてmockito-inlineを使用する必要があります。話の流れで最後の方で聞き…

Roomデータベースのテスト方法

Roomデータベースのテスト方法も聞いてみました。 コンテキストはInstrumentationRegistry.getInstrumentation().targetContextで取得します。データベースは、インメモリーデータベースを、RoomのinMemoryDatabaseBuilder()を使用して作成します。 以前、ア…

Kotlin, Androidのテストの基本(2)

Matcherクラス、Mockオブジェクト、各テストの前後の処理を記述するRuleについて、簡単に聞いてみました。 JUnit4で使えるMatcherについて教えてください。 正しい例外が発生するかどうかの検証はできますか? @Testアノテーションで指定できるテストが他に…

Kotlin, Androidのテストの基本(1)

AndroidではJUnit4がテストフレームワークとして用いられることが多いそうです。 通常のクラスを初め、Jetpack ComposeのUIのロジックまで、テスト駆動開発の手法が使えるそうで、仕事で業務アプリを作成したときのUIのテストで散々苦しんだ経験のある僕とし…

設定値の保存:SharedPreferencesよりはDataStoreを用いる

2020年に導入されたというDataStoreオブジェクトを用いて、設定値を保存する方法を聞きました。 SharedPreferencesを改善するために導入されたものだそうですが、キー・値のペアを保持する際、キーに値の型情報を持たせるという手法を用いていたり、非同期処…

Jetpack ComposeではEditViewではなくTextFieldを用いる

Jetpack Composeでは、EditViewではなく、TextFieldを用います。 また、保持するテキストは、SpannableStringではなく、AnnotatedStringです。 再表示周りの処理が従来のものと異なるので、似た機能の別コンポーネントが用意されているということだと思いま…

Jsoup:KotlinのプログラムでHTMLの表を加工する

JsoupというJavaのライブラリを用いて、HTMLを操作する方法を教えてもらいました。 元の文書がXMLの場合、パーサーを指定する必要があるそうなので、忘れないようにしたいです。 後半では、読み込み・書き込み時の文字コードの設定方法も教えてもらいました…

Firebaseって何だろう

「リアルタイムデータベースやプッシュ通知だけでなく、認証、アナリティクス、クラウドファンクションなど、多岐にわたる機能を提供しており、アプリ開発のさまざまな面で役立ちます」ということですが、今回はリアルタイムデータベースやプッシュ通知につ…

Jetpack ComposeとConstraintLayout

UI

Jetpack Composeでは、ConstraintLayoutは第一の選択肢でないようです。 Bootstrapのグリッドシステムっぽい手法に近いのかとも思いましたが、それとも違うようです。 Jetpack ComposeのConstraintLayoutの例を示してください。 ConstraintLayoutの方が一般…

Android, Kotlinの非同期処理

Jetpack ComposeでUIをデザインする際、Composable関数内に登場するStateFlow。 StateFlowのvalueが更新されることで、関連するComposable関数が再実行され、結果、StateFlowのvalueを参照するコンポーネントの表示も変わることになります。 ところで、非同…

比較的複雑なUIの実装例

Jetpack ComposeのColumnとRowの使い方を勘違いしていました。 あと、RadioButtonやCheckBox, LazyColumn, LazyRowといった複数の値や状態を持つコンポーネントの状態管理も、コード上の変数を通して管理するようで、従来のXMLベースのUIとは違った感じです…

Androidアプリで音声録音を実装する

音声録音の方法を聞いてみました。 ストリーミングと聞いて、リアルタイム音声通信などはできるかと思い、後半で聞いてみましたが、そちらはAndroid標準の機能だけで実装するのは難しそうです。 アプリ内から、音声の録音、録音したファイルの保存を行う方法…

Androidアプリ全体のデザイン:Scaffold

メニューの作成も、各画面への遷移も、Jetpack Composeを使うとかなり楽になりますね。 Scaffoldを用いたメニューのデザイン、画面の遷移、Androidデバイスによるメモリ管理に関わらず値を保持する方法など、教えてください。 sharedPreferencesを用いたデー…

Kotlinの依存性注入ライブラリ、Kodeinを使ってみる。

プラットフォームに依存せずどこでも使えるKotlinの依然性注入ライブラリ、Kodeinを、Androidアプリで使う方法について、ChatGPTに聞きました。 AndroidManifest.xmlに登録したクラス内で初期化するようです。 Kotlinの依存性注入ライブラリ、Kodeinの概要を…

Androidアプリをマルチモジュール化する

Jetpack Composeを用いるアプリが肥大化すると、UI確認のためにビルドが必要なことがネックになり、マルチモジュール化が必要になるそうです。 後々苦しまないよう、早めにChatGPTで聞いてみました。 マルチモジュール化とは何ですか? どうやって実現するの…

Androidアプリの開発手法の変遷について

ChatGPTに教えてもらいました。 僕は、Androidアプリ開発における、ViewModel以前を知りません。 Androidアプリの開発手法の変遷について教えてください。 このような変遷における、ViewModelの意義を教えてください。 データモデルとUIの間にViewModelを置…

物理エンジンが便利そう:JBox2D

Javaで書かれたJBox2DならKotlinでも使えます。 物理エンジンは、フレームレートの調整なども行ってくれるようです。 今は気が進みませんが、気が向いたら、使ってみようと思います。 あと、蛇足ですが、「衝突検知」というと難しいと思っていましたが、単純…

アプリをスリープ中も動かしたい:ForegroundService

ForegroundServiceを用いるとのことです。 イメージは、音楽再生アプリで、バックグラウンドでアプリが実行中であることを示す通知が表示されます。 ForegroudServiceの使い方を教えてください。 上のコードの内部的振る舞いも教えてください。 サンプルコー…

assetsやres/rawフォルダの音声の再生する

ゲームプログラミングなどで、プログラムで音声の再生や停止、切り替えをする方法が知りたくて、ChatGPTに聞きました。 音声を再生するにはどうするのですか? MediaPlayerオブジェクトとDisposableEffectについて、もう少し詳しく教えてください。 MediaPla…