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ştirici, scrollable değiştirici

Önemli etkinlikler

Compose'da, onKeyEvent değiştiricisini kullanarak 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 bir tuş etkinliğinin 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 tuş etkinliğini işliyorsa true değerini döndürün. Bu, etkinliğin yayılmasını durdurur.

Aşağıdaki snippet'te, kullanıcı Box bileşeninde S tuşunu bıraktığında bir 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 veya Enter tuşuyla medya oynatmayı açıp kapatabilir (oynatabilir veya duraklatabilir):

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

clickable değiştiricisi, tuş etkinliklerini yakalar ve boşluk 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 ile ilgili önemli etkinlik OuterComponent öğesine 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 bir tuş etkinliğini engellemek isteyebilirsiniz. TextField'e özel kısayollar eklemek, tipik bir örnektir. Aşağıdaki snippet, kullanıcıların sekme tuşuna basarak bir sonraki odaklanılabilir 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, önemli etkinlikle ilişkili işlemleri tetiklemeden önce önemli etkinliği 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 S tuşuna bastığında actionForPreview() işlevi yerine 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