サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
CES 2025
star-zero.medium.com
Use of dynamic dependency versions (e.g. 1.+ or [1.0,2.0)) makes builds non-deterministic. This causes builds to break… 他言語のライブラリ管理のロックファイル(BundlerのGemfile.lockやnpmのpackage-lock.json)と似たようなものになります。 動的なバージョンぼくが観測している範囲では基本的にあまりやらないことなんですが、Gradleで依存ライブラリを定義するときのバージョンを動的することができます。 例えば、以下のように + や [1.0,) などを使ったりした場合などは、実行するタイミングによっては使用されるバージョンが変わってしまいます。 dependencies { implementation("com.squareup.mosh
Detekt comes with a set of plugins that helps you configure it easily in your Gradle, Maven, Bazel, ... build. Enjoy… DetektはKotlinのコード静的解析ツールになっていて、フォーマットエラーやCode smellを検出してくれるものになります。 ktlintに比べて更に細かいことをしてくれますし、コードで問題がありそうな箇所も検出してくれるの、うまく運用すると非常に強力なものになると思います。 セットアップDetektの導入はドキュメントを見ても分かりにくい部分があるので、まずは最低限の設定でやっていきます。 今回はKotlin DSLを使った例になります。 まずはDetektのGardle Pluginをプロジェクト直下の build.gradle に追加します。
Photo by Chris Lawton on UnsplashNavigation Composeでも NavOptions が設定でき、画面遷移を細かく制御できるようになっています。この NavOptions の挙動についてまとめておきます。 NavGraph今回使用するNavGraphの定義は以下のようなシンプルな構成を考えます。 launchSingleTopオプションなしの画面遷移では、バックスタックのトップにある(今表示されてる)画面から同じ画面に遷移した場合、同じ画面が上に積まれることになります。遷移後にバックキーを押すと同じ画面がまた表示される感じです。 navController.navigate("screen_a") launchSingleTop を使うと、バックスタックのトップにある画面から同じ画面を表示した場合は、同じ画面がそのまま再利用されます。 navCo
Photo by Moritz Knöringer on Unsplash今年もAndroid開発状況を個人的な観点からまとめたいと思います。 去年はこちら Kotlin/CoroutinesKotlinとCoroutinesに関しては特に言うことはないかなぁっていうくらい当たり前なものになってきています。 現在コンパイラを書き換えていますが(K2 Compier)、今年完成するかどうかが気になるところです。 KSPに関しては、Stableリリースされましたが対応ライブラリがまだ多くない状況です。有名どころだとRoomとMoshiかなって感じですね。引き続き期待して待ちたいなと思っています。 Jetpack ComposeComposeは去年正式にリリースされ、それ以降はずっと話題の中心ですね。徐々に導入し始めたところもあると思います。 WidgetについてもComposeで作れるJetp
Target SDK 31(Android 12)から PendingIntent のmutability(可変性)を指定する必要があります。 https://developer.android.com/about/versions/12/behavior-changes-12#pending-intent-mutability 指定するときに FLAG_IMMUTABLE か FLAG_MUTABLE のどちらかの値を使用することになります。 この2つのフラグの違いについて解説します。 コード例まずは動作確認用として、Activityから別のActivityにPendingIntentを渡して、そのPendingIntentを実行する例です。 まずはPendingIntentを作って、それを別のActivityに渡すコードです。 次に、起動されたActivity側でPendingInte
Photo by Aleksi Tappura on UnsplashGradle 7.0から導入された Version catalog を使ったライブラリ管理方法についてまとめておきます。 また、Gradle 7.2ではいくつか改善がされてるので、今回はGradle 7.2を使っていきます。 Gradleで使用するライブラリの依存関係を定義するときに、これまでもいろいろな方法がありました。例えば、extra propertiesを定義したり、buildSrcで定義したり、など。 これらの方法とは別に Version catalog という新しい方法を使うことができるようになりました。 Version catalogの定義Version Catalogを使ってどのようにライブラリを管理するかを見ていきます。例として、androidxのviewmodelとlivedataを使う場合です。 s
既存のViewシステムのSpanと同様にJetpack Composeでもテキストの一部を装飾することができるので、実装方法を紹介します。 AnnotatedString というのを使って実現します。 簡単な実装 実装をみれば勘の良い方はすぐ理解できると思います。 buildAnnotatedString 関数のブロックで色々を設定していくことになります。実際には AnnotatedString.Builder を扱いやすくしたものになります。 withStyle を使ってスタイルを指定して、そのブロック内で装飾したい文字列を append で追加していきます。 withStyleを使わずに appendをした場合は、 Text Composable関数で指定したスタイルが適用されます。 スタイルには SpanStyle と ParagraphStyle が使えます。違いとしては文字単位に
最近よくAndroidエンジニアが足りない、採用難しいって話をよく聞くので、ぼくが感じてることを書きたいと思います。 すべての状況を理解してるわけでもなく、ぼく自身が感じてることなので、そこはご了承ください。また、Androidエンジニアを特別に優遇しろというわけではないので誤解しないようにしてもらえると。 Androidエンジニアは本当に少ないのか?ぼくはAndroidエンジニアは少ないとは思っていないです。ただメインでAndroidエンジニアをやっている人は少ないとは思います。 ぼくは昔はAndroidのコードを書いていたという人を何人か知っていますし、iOSがメインだけどAndroidもやってるっていう人も知っています。 なので、Android開発の経験者としてみると、そこそこの人数がいると考えています。 何かしらの理由がありメインではやらない、やりたくないっていう人もいるかもしれま
Jetpack ComposeにおいてUIの下位階層にデータを渡すには、Composable関数に引数を渡していくのが一般的だと思います。 引数で渡す以外の方法として、CompositionLocal があります。 これの使い方について解説します。 注意事項先に CompositionLocal に関する注意事項を書いておきます。 CompositionLocal はほとんどケースでは使わなくて良いものです。グローバル変数のように見えるため乱用するとメンテンスが難しくなったりバグを引き起こしやすくなったりする可能性があります。 一部ケースで有用なものですが、使用する際は十分に注意してください。 実装方法例として、User情報を下位階層に渡したい場合を実装していきます。 まず compositionLocalOf を使ってCompositionLocal のキーを作成します。 型パラメータと
Photo by Med Badr Chemmaoui on Unsplash状態管理する方法は色々ありますが、UiStateという状態を一つのclassでまとめて管理する方法を紹介します。 (UiStateの他にはUiModel, ViewStateなど色んな呼び方を見かけます) UiStateでも大きく2つやり方があるかなと思っています。 sealed class を使ったやり方と data class を使ったやり方です。 sealed class を使った管理sealed class を使って画面が取り得る状態を定義して、必要なデータは各継承クラスのプロパティに持たせる方法です。 以下のコメントに書いてる通り、各状態を sealed class を継承した data class や object で表現しています。
Photo by Erik Mclean on UnsplashAndroidのバージョンアップとともに、フルスクリーン画面を実現する方法が変更されてきたので、まとめておきます。 さらに次のAndroid 12でも一部変更が入りそうな気配です。 これまでの対応方法Android 4.0 以下テーマ (Theme.Holo.NoActionBar.Fullscreen)もしくは Window.setFlags で実現していました。 window.setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN )ただ、この FLAG_FULLSCREEN はAPI Level 30からはDeprecatedになっています。 Android 4.1以降、Android
Photo by Moritz Knöringer on Unsplash今年もAndroid開発状況を個人的な観点からまとめたいと思います。 去年のはこちら KotlinKotlinはもう言うことは特にないですね。 個人的には KSP がどうなるかが気になるところですね。 CoroutinesAndroid11のリリースと合わせて正式にCoroutinesが推奨される非同期処理となりました。(あとAsyncTaskがDeprecatedになりましたね) これまで以上にCoroutinesを使っていく場面が増えてくると思いますし、Jetpackライブラリでも当たり前のように使われていくと思います。 また、StateFlowやSharedFlowなどの便利なものも出てきています。 まだ触ったことない方はぜひチャレンジしてみてください。 https://developer.android.co
Dagger AndroidからHiltを段階的に移行する方法です。最初のいくつかの設定をすれば段階的に移行することができると思います。 サンプルプロジェクトを実際に段階的に移行したので、各ステップごとにその差分を見ながら確認してもらえると良いかなと思います。 サンプルプロジェクトマルチモジュール構成のシンプルなサンプルになっています。
Photo by Adam Solomon on Unsplash追記: まだまだ検討する必要があります。この記事は参考程度にしてもらえると助かります。 これまでViewModelからViewへのイベント通知を行うには、SingleLiveEvent がよく使われてきました。 これに代わる手法を個人的に色々模索してたのですが、Coroutines 1.4で導入された SharedFlow が使えるのではないかと思っています。 まだ実際にプロダクションに投入してるわけではないので、なにか見落としてることはあるかもです。そのときは指摘してもらえると嬉しいです。 SingleLiveEventの問題点SingleLiveEvent は LiveData を改造したものになり、そもそもの LiveData の挙動から大きく異なるものになります。 こちらの IssueTracker ではそういった理
Jetpack Composeの最初のalphaがリリースされました。 Jetpack Composeはモダンな宣言的UIツールキットです。これまでのAndroidのViewシステムは異なるものになるため、実装においても考え方が大きく異なります。 React, Vue.js, Flutterなどで開発したことがある方なら、実装時に考えることや気をつけることが理解できてるかもしれません。しかし、これらを開発したことない方にとってはもしかしたら難しく感じるかもしれません。 (ぼくは、React, Vue.js, Flutterはちょっと触った程度の人間ですが…Vue.jsは仕事で書いたかな。) ぼくが感じたJetpack Composeの実装においての考え方や気をつけたい箇所をまとめたいと思います。 (もしかしたら他の人と感じてることが違うかも?) Single source of truth
Coroutineはいくつか分かりにくいものがありますが、その中でも個人的に CoroutineContext については特に分かりにくいように感じます。 CoroutineContext について理解しておくと、Coroutineのキャンセルや例外をどう扱えば良いかが分かってきます。 色々な要素が絡んでるので説明する順番が難しくて分かりにくい箇所があるかもしれませんが、自分で試したりすると理解しやすいかと思います。 CoroutineContextとは?CoroutineContext はCoroutineをどのように動作させるかを定義するものになります。Coroutineが実行には必ず CoroutineContext が必要になります。 CoroutineContext は一つの何かを指すのではなく、様々な要素のセットになっています。 CoroutineContextを指定するCor
The Paging library helps you load and display pages of data from a larger dataset from local storage or over network… ※Paging 3はJava/RxJava・Guavaでも実装可能ですが、今回は試していません。 ネットワーク通信と組み合わせることを想定しての解説になります。 今回の環境は 3.0.0-alpha01 になります。 KotlinPaging 3は現時点ではJetpackの中で唯一すべてKotlinで書かれています。Javaからももちろん使用可能ではあります。 Coroutines / Flowが全面的に使用されています。 基本的な実装以前と異なり大幅に簡単になっています。 以前は実装する際に様々なクラスを定義する必要がありました。Roomと連携する際はそこ
Photo by Eaters Collective on Unsplashこの前、盛大に勘違いしてることがあったので、調べ直して挙動の違いをまとめました。 launchModeはAndroidManifest.xmlにActivityごとに設定でき、Activityの起動方法を指定しします。 standard (default)デフォルトのlaunchModeです。指定しない場合はstandardになります。 Activityが開始されるたびにスタックに積まれていきます。 バックキー等でActivityが終了するときに、最後に積まれたActivityから順番に取り除かれていきます。
Photo by Ussama Azam on UnsplashCoroutines 1.3.6 から StateFlow が導入されました。これは使い方等がLiveDataと似ているため、どういった違いがあるのか調べてみました。 これを書いてるときはまだ Exprimental なので、今後変更があるかもしれません。今回は1.3.7を使っています。 使い方まずは StateFlow の簡単な使い方です。 LiveDataと同じように定義してあげます。 MutableStateFlow をprivateにして、 StateFlow として外からは変更不可で公開してあげるのが丁寧ですね。 この例では数値をインクリメントしていくような処理になっています。 この StateFlow の変更通知を受け取る方法です。 見ての通り LiveData と使い方は非常に似ています。これらの違いについて分か
Activityも含めて、ここ最近は画面間でのデータのやりとりに大きめの変更が入ってきてます。 Fragmentの 1.3.0-alph04 から新しく setFragmentResult / setFragmentResultListener が追加されました。これを使うことで簡単にFragment間でのデータの受け渡しを実装できます。 https://developer.android.com/training/basics/fragments/pass-data-between 使い方は非常に簡単です。(fragment-ktx使っています) 結果を返す側返したい値を setFragmentResult にkeyと一緒に渡すだけです。 補足1setFragmentResultListener の処理は最初に STARTED の状態になったときに呼び出されます。また、呼び出し後には結果
After you build your Android App Bundle, you should test how Google Play uses it to generate APKs and how those APKs… bundletool で、 .aab ファイルからAPKを取得したり、端末にインストールできます。 セットアップGitHubのリリースページからjarファイルをダウンロードして、PATHが通ってるとこに配置します。 java -jarを起動するのは面倒なので、同じディレクトリに以下のようなShellScriptを作り、実行権限を与えておきます。 #!/bin/sh dir=$(dirname $0) java -jar "$dir/bundletool-all-0.4.0.jar" $@aabからapkセット取得次のコマンドで .aab からAPKのセットを
Activity 1.2.0-alpha02 と Fragment 1.3.0-alpha02 から ActivityResultContract が追加されました。 ActivityResultContract を使うことで、従来の onActivityResult とは違った方法でActivityの結果を受け取ることが可能になります。 ActivityResultContracts にいくつか用意されてるものがあります。 build.gradleimplementation "androidx.activity:activity-ktx:1.2.0-alpha02" implementation "androidx.fragment:fragment-ktx:1.3.0-alpha02"注意実装時の注意は別の記事で書きましたので、合わせて確認してください。
Photo by Robert Bye on Unsplash成功とエラーを一度だけ通知されるものをCoroutineに対応するには suspendCancellableCoroutine を使ってsuspend関数にすることで対応可能です。 イベントが複数回通知されるものは、何度も受信する必要があるためsuspend関数ではなくFlowで対応するの良いと思います。 callbackFlow のFlow Builderを使うことで簡単に実現することができます。 Androidの例ではBroadcastReceiverで受けとるイベントなどで役に立つと思います。 実装実装例を見ながら解説します。今回はネットワークのOn/Offを監視するイベントをFlowにしてみます。 まずは callbackFlow を使ってFlowにする実装です。まずは全体を見せてあとで解説します。 ネットワーク接続をO
Navigation 2.3.0-alpha02 からNavControllerに currentBackStackEntry と previousBackStackEntry が追加され、これらを使ってFragmentの戻り値を処理することが可能になりました。 内部的には各BackStackで SavedStateHandle と ViewModel を使ってるようです。 呼び出し元Fragment 呼び出し元のFragmentでは、 currentBackStackEntry の SavedStateHandle からLiveDataを取得して、それをobserveしておきます。 遷移後のFragmentで値が設定された場合にこの画面が再び表示されると、ここに通知されます。 値を返すFragment 値を返すには previousBackStackEntry の SavedStateH
Fragmentの初期化を onCreateView でやってる人も多いと思うんですけど、いつの間にか onCreateView のドキュメントに以下のような記述が追加されてました。 It is recommended to only inflate the layout in this method and move logic that operates on the returned View to onViewCreated(View, Bundle).
Photo by Jamie Street on Unsplash去年に引き続き、2020年1月におけるAndroid開発状況を個人的な観点からまとめたいと思います。 Kotlin今とはなってはKotlin Firstと言われていて、Androidのドキュメントやサンプルも基本はKotlinベースになってきます。 Javaのサンプルはベストエフォートのため、Javaのコードが無いものも出てきています。
App Bundleを使用してる場合、apkファイルがリソースも言語やdpi等で分割されますが、PlayStoreからインストールする際に自動でそのデバイスに必要なものをインストールするようになっています。 しかし、世の中にはapkファイルを取得してきて外部のストアに公開し、さらにそれをインストールする人がいます。 (正規のストア以外からインストールすることを Sideloading というらしいです) この場合、baseとなるapkだけが公開されたりするので、リソースのあるapkが足りずにエラーを起こすことになります。 原因不明の Resources$NotFoundException を見かけたら、これが原因の場合があります。 こういった不正な方法でインストールしたかどうかをチェックできる方法があります。 対策ライブラリ使用するのはPlay core libraryを使います。 imp
Googleの方にお声をかけていただき、Google Developer Expert (Android) になりました。 これからも変わらずブログを書いたり、登壇したりしながらAndroidに貢献していきたいと思ってます。 Android開発を楽しむ人がもっとたくさん増えるといいな。 引き続きよろしくお願いします!
Roomのマイグレーションについてまとめておきます。 環境Room 2.2.0やっておいたほうが良いことRoomのマイグレーションはテストが可能なのですが、その前にやっておいたほうが良い設定があります。 build.gradleに以下の設定を最初から追加しておくことをオススメします。 android { defaultConfig { javaCompileOptions { annotationProcessorOptions { arguments = ["room.schemaLocation": "$projectDir/schemas".toString()] } } } }この設定がなくても、Room自体は使用可能なのですが、マイグレーションのテストするには必要になります。 この設定をしておくと、モジュール直下にschemasのディレクトリが作られ、 1.json のようなバー
次のページ
このページを最初にブックマークしてみませんか?
『Kenji Abe – Medium』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く