2020年11月19日木曜日

MaterialAlertDialogBuilder のボタンの色を変更する

non-Bridge なテーマで MaterialAlertDialogBuilder を使うと、ダイアログのボタンの色は colorPrimary になります。

そのため colorPrimary に黒っぽい色を指定した DayNight テーマだと、Dark Mode のときにボタンの文字が見えないという状態になってしまいます。 <resources> <style name="Theme.MyApp" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> <item name="colorPrimary">#212121</item> </style> </resources>




DayNight テーマの colorPrimary は変えずに Dark Mode のときだけダイアログのボタンの色を変えるには、materialAlertDialogTheme 属性を指定します。

res/values/themes.xml <resources> <style name="Theme.MyApp" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> <item name="colorPrimary">#212121</item> <item name="materialAlertDialogTheme">@style/ThemeOverlay.MyApp.MaterialAlertDialog</item> </style> <style name="ThemeOverlay.MyApp.MaterialAlertDialog" parent="ThemeOverlay.MaterialComponents.MaterialAlertDialog" /> </resources> res/values-night-v8/themes.xml <resources> <style name="ThemeOverlay.MyApp.MaterialAlertDialog" parent="ThemeOverlay.MaterialComponents.MaterialAlertDialog"> <item name="colorPrimary">#ffffff</item> </style> </resources>




2020年11月12日木曜日

複数の nullable な mutable 変数の null チェック

nullable な mutable 変数 a と b があって、両方 non-null のとき何かしたいという場合、

これだとコンパイルエラーになる var a: String? = "Hello" var b: String? = "Android" fun main() { if (a != null && b != null) { println(a.length + b.length) // compile error! } } let だと入れ子になるからいまいち var a: String? = "Hello" var b: String? = "Android" fun main() { a?.let { a -> b?.let { b -> println(a.length + b.length) } } } ローカルの変数に入れれば OK var a: String? = "Hello" var b: String? = "Android" fun main() { val a = a val b = b if (a != null && b != null) { println(a.length + b.length) // ok } } vararg を使って、渡した値が全部 non-null だったら block を実行するというメソッドを用意すると、let っぽい感じで入れ子にせずに書ける var a: String? = "Hello" var b: String? = "Android" fun main() { doIfAllNotNull(a, b) { (a, b) -> println(a.length + b.length) } } private inline fun <T> doIfAllNotNull( vararg value: T?, block: (values: List<T>) -> Unit ) { val nonNullValues = value.filterNotNull() if (nonNullValues.size == value.size) { block(nonNullValues) } }

2020年11月11日水曜日

Kotlin メモ : vetoable

vetoable

変更を拒否(veto)するかどうかのコールバックを指定できる property delegate を返す。

fun main() { var value: Int by Delegates.vetoable(0) { property, oldValue, newValue -> newValue > 0 } println(value) // 0 value = 10 println(value) // 10 value = -1 println(value) // 10 }