Open7

Jetpack Compose

ピン留めされたアイテム

先に知っておきたかった事

  • LayoutXMLをComposeで書き換えるとテストは全部書き換えになる。
  • プレビュー機能はレンダリングされるまでの動作がかなり遅い。再コンパイル&再レンダリングに数秒かかる。
  • プレビュー機能
    • Dialogはプレビューできない。
      • 中身だけ別のComposableにする。
    • パーミッションを扱うものはプレビューできない。
      • 条件分岐してプレビューでは、パーミッションにアクセスするコードに到達しないようにする。
      • lazyでは逃げられない。
        • rememberPermissionState
          • @Composable invocations can only happen from the context of a @Composable function
    • Google Mapsはプレビューできない。
      • 条件分岐してプレビューではダミーのSpacerでも表示させておく。
    • Navigation ComposeのNavGraphBuilder.composableやdialogの外と内ではStateが伝搬しないっぽい。(起点にデバッグon/offフラグを持たせたかった。)hiltViewModelはできるっぽい。

相互運用

以下、公式から抜粋。

  • Activityの中でComposeを使う方法
    • ComponentActivityを継承してsetContentを使う。
  • Fragmentの中でComposeを使う方法
    • Fragment.onCreateViewでComposeViewを返す方法
      • 1つのFragmentで複数のComposeViewを使う場合はそれぞれidを別にする必要がある。
    • Layout XMLを使う方法
  • Viewの中でComposeを使う方法
    • AndroidViewを使う。
  • その他

https://developer.android.google.cn/jetpack/compose/interop/interop-apis

タップと押下

  • 単純なクリックイベントをハンドルするだけなら Modifier.clickable でよさそう。
  • タップ、ロングタップ、ダブルタップをハンドルするなら Modifier.pointerInput が使える。
  • Modifier.clickableModifier.pointerInput の両方を使うと後に指定した方が有効となるようだ。前に指定した方は動かないようだ。

Modifier.pointerInput の動作は次のとおりだった。

  • タップ
    1. onPress
    2. OnTap
  • 長押し
    1. onPress
    2. OnLongPress
  • ダブルタップ
    1. onPress
    2. onPress
    3. onDoubleTap

タップと長押しだけに対応したいなら以下のようなコードでよさそう。

Modifier
    .pointerInput(Unit) {
        detectTapGestures(
            onTap = {},
            onLongPress = {}
        )
    }

https://developer.android.com/jetpack/compose/gestures#tapping

リスト

パディングは contentPadding、コンテンツの間隔は verticalArrangement で指定できる。

LazyColumn(
    contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp)
) {
    // ...
}
LazyColumn(
    verticalArrangement = Arrangement.spacedBy(4.dp),
) {
    // ...
}

https://developer.android.com/jetpack/compose/lists
ログインするとコメントできます