Bereaksi terhadap fokus

Memberikan isyarat visual untuk visualisasi fokus yang lebih mudah

Meskipun semua elemen yang dapat difokuskan dari Material Theme sudah memiliki gaya fokus yang sesuai dengan tema, Anda mungkin perlu menambahkan beberapa elemen visual untuk membuat elemen yang terfokus yang lebih mudah ditemukan. Solusi yang baik adalah dengan mengubah batas tepi elemen Anda dengan warna yang memiliki kontras dengan latar belakang yang baik:

var color by remember { mutableStateOf(Color.White) }
Card(
    modifier = Modifier
        .onFocusChanged {
            color = if (it.isFocused) Red else White
        }
        .border(5.dp, color)
) {}

Dalam contoh ini, remember digunakan untuk menyimpan warna batas di seluruh rekomposisi, dan garis batas elemen diperbarui setiap kali elemen mendapatkan atau kehilangan fokus.

Mengimplementasikan isyarat visual lanjutan

Dengan Jetpack Compose, Anda juga dapat membuat visual yang lebih canggih dan canggih yang lebih cocok dengan UI Anda.

  1. Pertama, buat IndicationInstance yang secara visual menggambar isyarat yang Anda inginkan di UI:
    private class MyHighlightIndicationInstance(isEnabledState: State<Boolean>) :
        IndicationInstance {
        private val isEnabled by isEnabledState
        override fun ContentDrawScope.drawIndication() {
            drawContent()
            if (isEnabled) {
                drawRect(size = size, color = Color.White, alpha = 0.2f)
            }
        }
    }
  2. Selanjutnya, buat Indication dan ingat status fokus:
    class MyHighlightIndication : Indication {
        @Composable
        override fun rememberUpdatedInstance(interactionSource: InteractionSource):
            IndicationInstance {
            val isFocusedState = interactionSource.collectIsFocusedAsState()
            return remember(interactionSource) {
                MyHighlightIndicationInstance(isEnabledState = isFocusedState)
            }
        }
    }
  3. Tambahkan Indication dan InteractionSource ke UI, melalui pengubah indication():
    val highlightIndication = remember { MyHighlightIndication() }
    var interactionSource = remember { MutableInteractionSource() }
    
    Card(
        modifier = Modifier
            .clickable(
                interactionSource = interactionSource,
                indication = highlightIndication,
                enabled = true,
                onClick = { }
            )
    ) {}

Memahami status fokus

Umumnya, setiap kali status fokus berubah, FocusEvent dipicu hierarki, dan induk pengubah focusable() dapat memprosesnya menggunakan Pengubah onFocusChanged().

Jika Anda perlu mengetahui status fokus,Anda dapat menggunakan API ini bersama-sama dengan pengubah onFocusChanged:

  • isFocused menampilkan true jika composable tempat pengubah dilampirkan berfokus
  • hasFocus berfungsi mirip dengan isFocused, tetapi dengan perbedaan yang signifikan: alih-alih memeriksa yang saat ini saja, ia memeriksa apakah suatu elemen atau salah satu anak-anak tetap fokus
  • isCaptured menampilkan true setiap kali fokus ditahan. Hal ini terjadi, karena saat TextField berisi data yang salah sehingga pengguna mencoba berfokus elemen lain tidak akan menghapus fokus.

Kolom ini ditampilkan di bawah ini:

Modifier.onFocusChanged {
    val isFocused = it.isFocused
    val hasFocus = it.hasFocus
    val isCaptured= it.isCaptured
}