Klavye işlemlerini kullan

Kullanıcı, TextField gibi düzenlenebilir bir metin bileşenine odaklandığında ve cihazda donanım klavyesi takılı olduğunda tüm girişler sistem tarafından işlenir. Tuş etkinliklerini işleyerek klavye kısayolları sağlayabilirsiniz.

Varsayılan klavye kısayolları

Aşağıdaki klavye kısayolları varsayılan olarak kullanılabilir.

Klavye kısayolu İşlem Kısayolu destekleyen composable'lar
üst karakter+Ctrl+sol ok/sağ ok Kelimenin başına/sonuna kadar olan metni seçme BasicTextField, TextField
Üst karakter+Ctrl+Yukarı ok/Aşağı ok Paragrafın başına/sonuna kadar olan metni seçme BasicTextField, TextField
Üst karakter+Alt+Yukarı ok/Aşağı ok veya Üst karakter+Meta+Sol ok/Sağ ok Metnin başına/sonuna kadar olan metni seçme BasicTextField, TextField
Üst karakter+sol ok/sağ ok Karakter seçme BasicTextField, TextField
Ctrl+A Tümünü seç BasicTextField, TextField
Ctrl+C/Ctrl+X/Ctrl+V Kopyalama/kesme/yapıştırma BasicTextField, TextField
Ctrl+Z/Ctrl+üst karakter+Z Geri al/yeniden yap BasicTextField, TextField
PageDown/PageUp Kaydırma LazyColumn, verticalScroll değiştiricisi, scrollable değiştiricisi

Önemli etkinlikler

Oluşturma bölümünde, onKeyEvent değiştiricisiyle tek bir tuş vuruşunu işleyebilirsiniz. Değiştirici, değiştirilen bileşen bir tuş etkinliği aldığında çağrılan bir lambda kabul eder. Önemli etkinlikler KeyEvent nesnesi olarak tanımlanır. onKeyEvent değiştiricisine iletilen lambda'daki nesneye başvurarak her önemli etkinliğin bilgilerini alabilirsiniz.

Bir tuş vuruşu iki tuş etkinliği gönderir. Biri kullanıcı tuşa bastığında, diğeri ise tuş bırakıldığında tetiklenir. KeyEvent nesnesinin type özelliğine bakarak iki önemli etkinliği ayırt edebilirsiniz.

onKeyEvent lambda'sının döndürülen değeri, tuş etkinliğinin işlenip işlenmediğini gösterir. Uygulamanız önemli etkinliği işliyorsa true değerini döndürün. Bu değer, etkinliğin yayılmasını durdurur.

Aşağıdaki snippet'te, kullanıcı Box bileşeninde S tuşunu bıraktığında doSomething() işlevinin nasıl çağrılacağı gösterilmektedir:

Box(
    modifier = Modifier
        .onKeyEvent {
            if (
                it.type == KeyEventType.KeyUp &&
                it.key == Key.S
            ) {
                doSomething()
                true
            } else {
                false
            }
        }
        .focusable()
) {
    Text("Press S key")
}

Değiştirici tuşlar

KeyEvent nesnesinde, değiştirici tuşlara basılıp basılmadığını gösteren aşağıdaki özellikler bulunur:

Uygulamanızın işlediği önemli etkinlikleri açıklarken net olun. Aşağıdaki snippet, yalnızca kullanıcı S tuşunu bıraktığında bir doSomething() işlevini çağırır. Kullanıcı, Üst Karakter tuşu gibi herhangi bir değiştirici tuşa basarsa uygulama, işlevi çağırmaz.

Box(
    modifier = Modifier
        .focusable()
        .onKeyEvent {
            if (
                it.type == KeyEventType.KeyUp &&
                it.key == Key.S &&
                !it.isAltPressed &&
                !it.isCtrlPressed &&
                !it.isMetaPressed &&
                !it.isShiftPressed
            ) {
                doSomething()
                true
            } else {
                false
            }
        }
) {
    Text("Press S key with a modifier key")
}

Boşluk çubuğu ve Enter tuşu tıklama etkinlikleri

Boşluk çubuğu ve Enter tuşu da tıklama etkinliklerini tetikler. Örneğin, kullanıcılar tıklama etkinliklerini aşağıdaki gibi işleyerek boşluk çubuğu veya Enter tuşuyla medya oynatmayı açıp kapatabilir (oynatma veya duraklatma):

MediaPlayer(modifier = Modifier.clickable { togglePausePlay() })

clickable değiştiricisi, tuş etkinliklerini yakalar ve boşluk çubuğu veya Enter tuşuna basıldığında onClick() geri çağırma işlevini çağırır. Bu nedenle, snippet'te boşluk çubuğu veya Enter tuşuna basılarak togglePausePlay() işlevi çağrılır.

Tüketilmeyen önemli etkinlikler

Tüketilmeyen önemli etkinlikler, etkinliğin gerçekleştiği bileşenden kapsayıcı dış bileşene yayılır. Aşağıdaki örnekte InnerComponent, S tuşu bırakıldığında tuş etkinliklerini kullanır. Bu nedenle OuterComponent, S tuşunun bırakılmasıyla tetiklenen tuş etkinliklerini almaz. Bu nedenle actionB() işlevi hiçbir zaman çağrılmaz.

InnerComponent üzerindeki diğer tuş etkinlikleri (ör. D tuşunu bırakma) OuterComponent tarafından işlenebilir. D tuşunu bırakma önemli etkinliği OuterComponent'e yayıldığı için actionC() işlevi çağrılır.

OuterComponent(
    modifier = Modifier.onKeyEvent {
        when {
            it.type == KeyEventType.KeyUp && it.key == Key.S -> {
                actionB() // This function is never called.
                true
            }

            it.type == KeyEventType.KeyUp && it.key == Key.D -> {
                actionC()
                true
            }

            else -> false
        }
    }
) {
    InnerComponent(
        modifier = Modifier.onKeyEvent {
            if (it.type == KeyEventType.KeyUp && it.key == Key.S) {
                actionA()
                true
            } else {
                false
            }
        }
    )
}

onKeyPreviewEvent değiştirici

Bazı kullanım alanlarında, varsayılan işlemi tetiklemeden önce önemli bir etkinliği yakalamak isteyebilirsiniz. TextField klasörüne özel kısayollar eklemek tipik bir örnektir. Aşağıdaki snippet, kullanıcıların sekme tuşuna basarak odaklanılabilir bir sonraki bileşene geçmesine olanak tanır.

val focusManager = LocalFocusManager.current
var textFieldValue by remember { mutableStateOf(TextFieldValue()) }

TextField(
    textFieldValue,
    onValueChange = {
        textFieldValue = it
    },
    modifier = Modifier.onPreviewKeyEvent {
        if (it.type == KeyEventType.KeyUp && it.key == Key.Tab) {
            focusManager.moveFocus(FocusDirection.Next)
            true
        } else {
            false
        }
    }
)

Varsayılan olarak TextField bileşeni, tuş etkinliği onKeyEvent değiştiricisiyle işlense bile kullanıcılar Sekme tuşuna her bastığında bir sekme karakteri ekler. Klavye odağını sekme karakteri eklemeden taşımak için, snippet'te olduğu gibi, tuş etkinliğiyle ilişkili işlemleri tetiklemeden önce tuş etkinliğini işleyin. onKeyPreviewEvent() lambda, true değerini döndürerek önemli etkinliği yakalar.

Üst bileşen, alt bileşenlerinde gerçekleşen tuş etkinliğini kesebilir. Aşağıdaki snippet'te, kullanıcılar actionForPreview() işlevini çağırmak yerine S tuşuna bastığında previewSKey() işlevi çağrılır.

Column(
    modifier = Modifier.onPreviewKeyEvent {
        if (it.key == Key.S) {
            previewSKey()
            true
        } else {
            false
        }
    }
) {
    Box(
        modifier = Modifier
            .focusable()
            .onPreviewKeyEvent {
                actionForPreview(it)
                false
            }
            .onKeyEvent {
                actionForKeyEvent(it)
                true
            }
    ) {
        Text("Press any key")
    }
}

Kullanıcılar Sekme tuşuna bastığında da Box bileşeni için onPreviewKeyEvent() lambda tetiklenmez. Önce üst bileşendeki onPreviewKeyEvent() lambda, ardından alt bileşendeki onPreviewKeyEvent() çağrılır. Bu davranıştan yararlanarak ekran genelinde klavye kısayolları uygulayabilirsiniz.

Ek kaynaklar