アプリ開発備忘録

PlayStationMobile、Android、UWPの開発備忘録

Kotlin

Enumを扱う【kotlinx.serialization】

Enumもカスタムタイプのパースと同じく、 Serializer を作成しなければなりません。Jacksonは @JsonCreator と @JsonValue だけでできるので、少し面倒に感じましたが、メリットはあります。 Stringの値でパースする abstract なシリアライザを作成しました…

Apollo KotlinでCustomTypeを使用する

GitHub APIで使用していたら、一部がAnyになってしまいました。 以下のようなファイルが生成されていました。 これを2つの工程で好きな型に変換します。 // AUTO-GENERATED FILE. DO NOT MODIFY. // // This class was automatically generated by Apollo Gr…

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

【Kotlin】ライブラリにInterfaceと同じ大文字から始まる関数がある理由

環境 Kotlin Coroutine 1.4.2 問題 このような関数があります。実装は StateFlowImpl ですが、わざわざ MutableStateFlow という関数を作ってそこから作成させるようになっています。 @Suppress("FunctionName") public fun <T> MutableStateFlow(value: T): Mu</t>…

Java Agentで実行時にクラスを差し替える

Java Agentとは java コマンドを実行するとhelpが出力されるわけですが、そこにJava Agentについて書いてあります。 -javaagent:<jarpath>[=<options>] Javaプログラミング言語エージェントをロードする。java.lang.instrumentを参照 Instrumentとは 既存のアプリケーションを</options></jarpath>…

Kotlin1.4の変更点

以下をざっと紹介しいきます。 https://kotlinlang.org/docs/reference/whatsnew14.html SAM変換 Androidで言うと setOnClickListener がよく使っていると思います。 public interface OnClickListener { void onClick(View var1); } JavaのInterfaceで関数…

【kotlinx.serialization】Kotlin/JSでJsonをパース

1.4-M1 で試そうとしたのですが、おそらく、kotlinx.serialization のコード生成部分がうまく動かなかったので 1.3.71 で行いました。 gradleのバージョンは 5.6.1 。 Slackのコマンドのリクエストをパースしてみました。 コード build.gradle.kts plugins {…

Kotlin/JSでpackage.jsonの出力をカスタマイズする。(MPP対応)

Kotlin/JS は Kotlin/JS としてセットアップするか、 Kotlin MultiPlatform Project(Kotlin MPP) としてセットアップするかの二種類があります。 ここでは全体としての Kotlin/JS と、Kotlin/MPP と対になっている Kotlin/JS の表記が混じっています。 基本…

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

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

Kotlinのdata classでAnnotationとプロパティを一行で書いてフォーマットも乗り越える方法。

要件 これは このように改行させたくないけれど、 これは改行させたいという要件がありました。 Wrap if long Method call arguments Wrap if long が Wrap if long だと以下のようになります。 @JsonProperty( の次から改行されてしまっています。 だからと…

Kotlinで即時実行Delegation

KotlinのDelegation、便利ですよね。プロパティの名前を取得できるという点が便利で、Annotation Processorの代わりに使われたりもします(代替の技術ではないけど)。 紹介する機能 今回はDelegationの Providing a delegate という機能を知ったため、これ…

Swift vs Kotlin

暫定。初めてSwiftを書いてみて、ここ必要だなという部分をメモ。 Std Out Swift print("") Kotlin println("") Declaring variables Swift let number = 42 var message: String = "Hello" // let -> NG number = 0 // var -> OK message = "" Kotlin val n…

KotlinのMapのKeyについて

MapのKeyって文字列とか数値とかしか使ってなかったけど他のdata classとか使いたいなとなったので調べた。 確かめる 何も考えずdata classを使う ちゃんと直感的に動く data class MapKey(val key1: Int, val key2: Int) fun main(args : Array<String>) { // {MapK</string>…

KotlinをGradleでビルド

gradleでビルドする時に以下のように書けというのが多いですが動かなかったので調べました。 既存コード jar { manifest { attributes 'Main-Class': 'net.matsuda.MainKt' } from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) …

Kotlin Contractsが必要な場面に遭遇した

Kotlin Contractsあまり理解していなかったのと、自分で書く必要があるとは思わなかったのでこんな所で使うんだなと思って書きました。 まずこのようなコードがあります。 時間を計測するKotlinのスタンダードライブラリの関数です。 public inline fun meas…

【Kotlin】関数型でスマートキャストが使えない

バージョン Kotlin 1.3.0 以下のコードでblock()はダメだけどblock.invoke()はスマートキャストされる。 class Hoge(val block: (() -> Unit)?) { fun hoge() { if (block != null) { block() // NG block.invoke() // OK } } } とりあえず探してみたらあっ…

ToolBarとかのサポートライブラリでDataBinding

Android data bindingで定義済みの属性リスト - Qiita 「android:onMenuItemClick」とか定義されてるはずなのに使えんなと思ってまさかと思い確認。 原因 extensions/baseAdapters/src/main/java/android/databinding/adapters/ToolbarBindingAdapter.java -…

Android Kotlin DataBindingのTwo-wayでisHogeというフィールド名が使えない

エラー文 Error:java.lang.IllegalStateException: failed to analyze: android.databinding.tool.util.LoggedErrorException: Found data binding errors. ****/ data binding error ****msg:The expression [...] cannot be inverted: Two-way binding can…

【Kotlin】スコープ拡張関数まとめ

よく忘れるのでまとめた。 スコープ拡張関数 関数名 it 戻り値 定義 also ○ 自身 fun T.also(block: (T) -> Unit): T { block(this); return this } apply ✕ 自身 fun T.apply(f: T.() -> Unit): T { f(); return this } let ○ 最後 fun T.let(f: (T) -> R):…