Jetpack Compose で Material Design の ToggleButton を作ってみた
Material Design の ToogleButton (https://material.io/components/buttons#toggle-button) を Jetpack Compose で作ってみた。 https://github.com/yanzm/ComposeToggleButtonこんな感じのやつ。 選択の処理は Modifier.toggleable() を使えば...
View ArticleJetpack Compose : Canvas Composable を使う
View の onDraw() で描画して Custom View を作る、というのを Compose でやりたいときは Canvas Composable を使います。 Canvas に渡す onDraw lamnda は Receiver が DrawScope になっています。DrawScope からは描画エリアの大きさとして size: Size が取れます。 また、DrawScope は...
View Articleinline class および value class で kotlinx.serialization (JSON) が動く組み合わせ
inline class および value class で kotlinx.serialization (JSON) が動く組み合わせを調べてみた inline class のときのコード @Serializable inline class ItemId(val value: String) @Serializable data class Item(val id: ItemId, val...
View ArticleJetpack Compose でフォーカスをクリアする
フォーカスをクリアするときは LocalFocusManager Composition Local から取得した FocusManager を使う val focusManager = LocalFocusManager.current Button(onClick = { focusManager.clearFocus() }) { Text("Button") }
View ArticleJetpack Compose で Spannable 的なことをしたいときは AnnotatedString を作る
buildAnnotatedString 関数が用意されている。 Text( text = buildAnnotatedString { append("By clicking blow you agree to our ") withStyle(style = SpanStyle(textDecoration = TextDecoration.Underline)) { append("Terms...
View ArticleJetpack Compose で AutoSizeableTextView 的なのを作る
残念ながらオフィシャルでのサポートは(まだ)ない。 Textの onTextLayout で TextLayoutResult の hasVisualOverflow (didOverflowWidth および didOverflowHeight もある) が true だったら remember {} してる文字サイズを変更するという方法でそれっぽいのは作れるが、State...
View ArticleJetpack Compose : disabled のとき Image や Text の色を薄くしたい
Checkbox とか Switch とか enabled 設定が用意されている Composable では enabled に false を設定すると色が薄くなるよう実装されています。 @Composable fun Checkbox( ... enabled: Boolean = true, ... ) { ... } Text とか Image には enabled...
View ArticleJetpack Compose : Lifecycle.Event で処理をトリガーする
通知が有効になっているかどうか調べる処理 (NotificationManagerCompat.from(context).areNotificationsEnabled()) を毎 onResume で行い場合はこんな感じになる。 @Composable fun SampleScreen( notificationEnabled: Boolean, onCheckNotification: ()...
View ArticleKotlin の sealed interface が必要になる例
(本当は Compose のコード例(State/MutableState)にしたかったんだけど、まだ Jetpack Compose は Kotlin 1.5 に対応してないので sealed interface 使えないんだよね...) ViewModel で持ってる LiveData を Activity で observe してるとする。 class MainActivity :...
View ArticleCompose の Text を長押しで文字選択できるようにしたい
SelectionContainer を使います。 SelectionContainer { Text("This text is selectable") } 選択ハンドルなどの色は MaterialTheme.colors.primary が使われます。 残念ながら SelectionContainer には直接色を指定するパラメータは用意されていません。 ピンポイントで色を指定したいなら...
View ArticleJetpack Compose で Runtime Permission をリクエストする
onStart() でパーミッションがあるかどうかチェックして、無い場合はパーミッションをリクエストする処理です。 rememberLauncherForActivityResult() を使います。 enum class PermissionState { Checking, Granted, Denied, } @Composable private fun...
View ArticleJetpack Compose: Text の文字サイズを dp で指定する
Text の文字サイズを dp で指定したい(fontScale に依存しないようにしたい)ときはこのようにします。 val density = LocalDensity.current Text( text = "Hello", fontSize = with(density) { 18.dp.toSp() }, )
View ArticleJetpack Compose : キーボードが表示されたときに scrollable な Column 内の TextField が見えるようにスクロールする
1. accompanist-insets を入れるimplementation "com.google.accompanist:accompanist-insets:$accompanist_version"2. Activity に android:windowSoftInputMode="adjustResize"をセットする * accompanist-insets がちゃんと動くために必要...
View ArticleJetpack Compose : Modifier.weight() の fill パラメータ
Modifier.weight() には float 値の他に fill するかどうかの boolean パラメータを指定できます。 @Stable fun Modifier.weight( weight: Float, fill: Boolean = true ): Modifier fill に true を指定すると、割り当てられた領域を占めるように配置されます。fill に false...
View ArticleJetpack Compose : 点線を描画する
点線を描画するには PathEffect.dashPathEffect() を使う Canvas { drawRoundRect( color = color, cornerRadius = radius, style = Stroke( width = strokeWidth, pathEffect = PathEffect.dashPathEffect( intervals =...
View ArticleJetpack Compose + ViewModel + Navigation + Hilt + AssistedInject
Jetpack Compose + ViewModel + Navigation + Hilt の ViewModel で AssistedInject を使う方法。 ViewModelExt.kt @Composable inline fun <reified VM : ViewModel> assistedViewModel( viewModelStoreOwner:...
View ArticleJetpack Compose + ViewModel + Navigation + Hilt で UI テスト
テスト対象の Compose @HiltAndroidApp class MyApplication : Application() @AndroidEntryPoint class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) {...
View Articlenavigation-compose は ViewModel のライフサイクルをどう管理しているのか
twitter で言及したこれの解説です。 ViewModel が Compose のライフサイクルと対応してないって言ってる正確な意味はわからないけど、SingleActivity + full Compose で、Compose で作った1画面を今までの Activity や Fragment のように使いたいなら navigation-compose...
View ArticleJeptack Compose : DrawScope に描画したものを Bitmap にする。Bitmap を DrawScope に描画する。
ImageBitmap から Bitmap への変換には ImageBitmap.asAndroidBitmap() を使います。 Bitmap から ImageBitmap への変換には Bitmap.asImageBitmap() を使います。 @Preview @Composable fun SampleScreen() { val density = LocalDensity.current...
View Article遷移先情報(deep link とか)を持つ Intent の処理タイミング
以下では、SingleActivity で画面遷移は Navigation Compose を使っている前提である。 ポイント1 : Activity 再生成時には処理しないように onCreate() では savedInstanceState をチェックする Navigation Compose の backstack 情報は再生成に restore される class MainActivity...
View Article