Open7
Jetpack Compose
ピン留めされたアイテム
先に知っておきたかった事
- LayoutXMLをComposeで書き換えるとテストは全部書き換えになる。
- プレビュー機能はレンダリングされるまでの動作がかなり遅い。再コンパイル&再レンダリングに数秒かかる。
- プレビュー機能
- Dialogはプレビューできない。
- 中身だけ別のComposableにする。
- パーミッションを扱うものはプレビューできない。
- 条件分岐してプレビューでは、パーミッションにアクセスするコードに到達しないようにする。
- lazyでは逃げられない。
- rememberPermissionState
- @Composable invocations can only happen from the context of a @Composable function
- rememberPermissionState
- Google Mapsはプレビューできない。
- 条件分岐してプレビューではダミーのSpacerでも表示させておく。
- Navigation ComposeのNavGraphBuilder.composableやdialogの外と内ではStateが伝搬しないっぽい。(起点にデバッグon/offフラグを持たせたかった。)hiltViewModelはできるっぽい。
- Dialogはプレビューできない。
相互運用
以下、公式から抜粋。
- Activityの中でComposeを使う方法
- ComponentActivityを継承してsetContentを使う。
- Fragmentの中でComposeを使う方法
- Fragment.onCreateViewでComposeViewを返す方法
- 1つのFragmentで複数のComposeViewを使う場合はそれぞれidを別にする必要がある。
- Layout XMLを使う方法
- Fragment.onCreateViewでComposeViewを返す方法
- Viewの中でComposeを使う方法
- AndroidViewを使う。
- その他
Card
- クリック可能にするには
Modifier.clickable
が使える。 -
onClick
は今のところ@ExperimentalMaterialApi
のようだ。 - androidx.compose.material.Card
- androidx.compose.material.Card / @ExperimentalMaterialApi
- Cards - Material Design
Icon
タップと押下
- 単純なクリックイベントをハンドルするだけなら
Modifier.clickable
でよさそう。 - タップ、ロングタップ、ダブルタップをハンドルするなら
Modifier.pointerInput
が使える。 -
Modifier.clickable
とModifier.pointerInput
の両方を使うと後に指定した方が有効となるようだ。前に指定した方は動かないようだ。
Modifier.pointerInput
の動作は次のとおりだった。
- タップ
- onPress
- OnTap
- 長押し
- onPress
- OnLongPress
- ダブルタップ
- onPress
- onPress
- onDoubleTap
タップと長押しだけに対応したいなら以下のようなコードでよさそう。
Modifier
.pointerInput(Unit) {
detectTapGestures(
onTap = {},
onLongPress = {}
)
}
リスト
パディングは contentPadding
、コンテンツの間隔は verticalArrangement
で指定できる。
LazyColumn(
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp)
) {
// ...
}
LazyColumn(
verticalArrangement = Arrangement.spacedBy(4.dp),
) {
// ...
}
Snackbar
Scaffoldに表示させる例: