くうと徒然なるままに

モバイルアプリを作りながらバックエンドも作っています。

Kotlin

Jetpack compose for Desktop でLocal に存在する画像を表示する

前置き Jetpack Compose for Desktop version 0.2.0 での話です。 Jetpack Compose for Desktop での画像表示の現状 Jetpack compose for Desktop のSDK では 画像を表示する関数 Image() が定義されています。 Image() 関数では、 ImageBitmap, Painter, Im…

Bitmap を ByteArray に変換する拡張関数を書いた

fun Bitmap.toByteArray(): ByteArray { val buffer = ByteBuffer.allocate(this.byteCount) this.copyPixelsToBuffer(buffer) return buffer.array() }

Spek 2.0 で Data-Driven test はサポートされてないらしい

github.com 普通のKotlin のコードで表現してねって感じらしい.

Fragment で Snackbar を表示させるHelperメソッドを書いた。

暗記とか苦手なので書く。 重要なのは、 android.R.id.content で Activity の乗ってる View を取ってきてそこに表示してる fun Fragment.showSnackbar( text: String, @BaseTransientBottomBar.Duration length: Int = Snackbar.LENGTH_SHORT ) { Snackbar.…

Gson で List<*> なクラスをJsonからパースするときにシュッと処理してくれる拡張関数を書いた。

ソリューションはあるけど、拡張関数でシュッと解決してくれるものがググっても出てこなかったので書きました。 ソースコード inline fun <reified T> Gson.fromJson( json: String ): T { return this.fromJson( json, object : TypeToken<T>() {}.type ) } 一番シュッと</t></reified>…

Gradle Custom Task with kotlin を実行するときに 引数を渡したり実行結果を読み取る。

Gradle Task に引数を渡す Gradle Task を実行するときに引数を渡したいときがあると思います。 build.gradle内で完結している場合には、以下のように lateinit var な変数を定義すれば値を渡すことができます。 lateinit var userName: String さて、build.…

LiveData-Kotlin Extension を試してみた

基本的には、 Transformations の拡張関数の集合です。 implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.1.0-alpha04" class MainActivityViewModel : ViewModel() { private val source1LiveData = Source1Livedata() // 同じものが流れてき…

Spek/Kotlin を使っている時に LiveData を利用した Unit Test を記述する

Live Data を使ったコードのテストを記述する場合にはメインスレッドで実行しなければいけない Live data をUnit Test であれこれする時には、 MainThread で実行しなければいけないという制限が問題になります。 具体的には、 LiveData の setValue メソッ…

kotlin で lambda 関数の呼び出しログと回数を記録できる便利クラスを作ってみた。

Unit Test 等で lambda 関数 を使用しているところで呼び出しログと呼び出し回数を記録したいことはたまによくあると思います。 そこで、記録できる便利クラスを書いてみました。 機能 呼び出しログの記録 回数の記録と検証(指定された回数呼び出されてなか…

Kotlinで文字列から雑にDate のインスタンスを作れる拡張関数

必要そうだったから書いてみた。エラー処理とかないので場所に応じて使うべし。 fun String.toDate(format: String = "yyyy/MM/dd HH:mm"): Date = SimpleDateFormat(format, Locale.JAPAN).parse(this) ex "2019/1/2 3:4".toDate()

Android で ChipGroup に属しているChip を列挙する

ChipGroup Class には 追加されている Chip 一覧を取得できそうな関数が生えてないです。 val chipGroup = // Chip Group への参照を取得する val chipCount = chipGroup.childCount // 2 (0..chipCount - 1) .map { chipGroup.getChildAt(it) as Chip } .ma…

Firebase Readtime DB + Kotlin Coroutine でいい感じに使う

Firebase の Realtime Database 使ってますか? firebase.google.com 問題点 基本的に Callback な作りなため Kotlin Coroutine との相性がよくない Firebase Realtime Database で値を読み取る時には基本的には Callback スタイルなコードを書きます。 Kotl…

AndroidX の androidx.textclassifier を試してみる

アドベントカレンダー Android 初心者 15日目の記事です。 まだ枠が空いているので記事を見た人は登録するか3人の Android エンジニアに送りつけてください。 qiita.com 初心者ということで試してみた記事を書いてみたいと思います。 Android 8 ~ テキスト…

Android-Kotlin で現在起動してるアプリの設定画面に移動する

コード val intent = Intent() intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS val packageName = context?.packageName ?: return@setOnClickListener val uri = Uri.fromParts( "package", packageName, null ) intent.data = uri startAc…

Android アプリで現在デバッグ実行中かを判定する方法

Android アプリを作っていて、現在デバッグ実行されているかを確認したいことはたまによくあると思います。 BuildConfig から取得すればいけ感じな。 コード BuildConfig.DEBUG 情報元 stackoverflow.com

Extended FAB っぽいものを実装してみた

Extended FAB を実装するモチベーションはFAB をよりユーザーにわかりやすく実装するため 普通のアイコンだけのFAB だけで実装してましたが、 「アイコンだけでは何をするためのものかすぐに理解して使い始めることができない」という問題が出てきました。 …

Mockito で void なメソッドをモックする

Mockito はいいぞ〜 さて、 void なメソッドを mock するにはどうすれば良いのかってのは少しハマったので書いてきます〜 解決方法 doNothing().when(targetMock).targetMethod() 的な感じで実装してくといけました〜。 コードで解説 val keyword = "hello w…

BottomAppBar で menu を表示する

BottomAppBar で menu を表示するためには、以下のメソッド読んであげれば表示できます。 {BottomAppBar への参照}.replaceMenu(R.menu.ResourceFileName)

Android の Fuel + Moshi + Kotlin Coroutine でいい感じにする拡張関数を書いた

Fuel には、 mochi、 Kotlin Coroutine といい感じに連携してくれる機能があります。 けど、 Moshiと Kotlin Coroutine を組み合わせていい感じに呼び出せる関数は存在してないです。(まぁ、標準で存在してても依存関係考えたら載せるべきでないのはそう)…

java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/databinding/DataBinderMapperImpl; ってエラーがでた

エラーメッセージ java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/databinding/DataBinderMapperImpl; 解決策 dataBinding { enabled = true } databinding の設定を AppModule にし忘れてただけですね.... マルチモジュールで作ってると…

Invoke-customs are only supported starting with android 0 --min-api 26 ってエラーがでた

ライブラリの追加をしたら下記のようなエラーが出ました。 そこで、解決策を書いていきたいと思います。 Invoke-customs are only supported starting with android 0 --min-api 26 解決策 以下を追加した Module の Build.gradle へ追記したら解決しました…

Navigation Architecture Component で BottomNavigation と Include した Navigation Graph を紐付ける

Android 3.2 正式リリース && Androidx 1.0 おめでとうございます さて、 Android Studio 3.2 から入ってきた Navigation Architecture Component (NAC) NAC には BottomNavigationView (and DrawerView?) と紐づけ、Fragment の ID と menu の id を一緒に…

Android で Databinding しようとしたら Cause: couldn't make a guess for {Class Name} ってエラーがでる

状況 以下のようなエラーが出てしまいました... Cause: couldn't make a guess for {Class Name} 解決策・原因 パッケージネームに大文字が混入してたのが原因です。 意外に見つけにくい...

Kotlin, JUnit で パラメタライズドテストを書く

こちらで書いたコードに対してパラメタライズドテストを書いていきます。 kuxumarin.hatenablog.com 環境 testImplementation 'junit:junit:4.12' コード Java で書くときは、Static な感じで書いてたのは companion object にしました。 @RunWith(Parameter…

Kotlin で HTML を テキストに変換する

public fun String.removehtmlTag(): String = this .replace(Regex("<[^>]*>"), "") .replace("\n", "")

Android で 長文をいい感じに省略して表示する

任意の長さの文字列をいい感じに省略して 表示することはよくあるかと思います。 そんな時にいい感じに表示する方法です。 方法 <TextView android:layout_height="wrap_content" android:layout_margin="12dp" android:ellipsize="end" android:maxLines="2" tools:text="雑な文字列雑な文字列雑な文字列雑な文字列雑な文字列雑な文字列雑な文字列雑な文字列雑な文字列雑な文字列雑な文字列雑な文字列雑な文字列雑な文字列雑な文字列雑な文字列" /></textview>

Android-Kotlin な Multi Module な構成で 他Module の Class を参照しようとすると Unresolved Reference とでる。

症状 どこもおかしくないはずなのに、新規で追加した Android Module で定義されている Class を参照しようとすると "Unresolved Refernece " って出てきてツラミでした。 また、 Android Studio では普通に 入力補完されます。 なのに、ビルドすると上記の…

Android-Kotlin で ユーザーに画像を一枚選択させてその画像の場所を取得したい

はじまり Android のアプリを作成していて、 ユーザーに画像を一枚選択してもらい、その画像に対してあれこれしたい。みたいな時があるかと思います。そんなときのための記事です。 プログラムの流れの解説 開きたい画像を選択させる Intent を飛ばす ユーザ…

Android-Kotlin で Wifi のSSIDを取得する

class SSIDManager{ fun GetSSID(ApplicationContext:Context): String{ val wifiManager = ApplicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager if(!wifiManager.isWifiEnabled) return ""; val connectInfo = wifiManager.connecti…