Klavye işlemlerini kullan

Kullanıcı odağı TextField gibi düzenlenebilir metin bileşenine verdiğinde Cihaza bir donanım klavyesi takılıysa tüm girişler sistem tarafından işlenir. Önemli etkinlikleri işleyerek klavye kısayolları sağlayabilirsiniz.

Varsayılan klavye kısayolları

Aşağıdaki klavye kısayolları kullanıma hazırdır.

Klavye kısayolu İşlem Kısayolu destekleyen Composable'lar
Üst karakter+Ctrl+Sol ok/Sağ ok Kelime başına/sonuna kadar metni seçme BasicTextField, TextField
Üst Karakter+Ctrl+Yukarı ok/Aşağı ok Paragrafın başına/sonuna kadar metin 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
ÜstKrktr+Sol ok/Sağ ok Karakterleri 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 alma/yeniden yapma BasicTextField, TextField
PageDown/PageUp Kaydır LazyColumn, verticalScroll değiştirici, scrollable değiştirici

Önemli etkinlikler

Oluşturma'da tek bir tuş vuruşunu onKeyEvent değiştiricisi. Değiştirici, değiştirilmiş bileşen önemli bir etkinlik aldığında çağrılan bir lambda kabul eder. Önemli etkinlik, KeyEvent nesnesi olarak tanımlanır. onKeyEvent değiştiricisine iletilen lambdadaki nesneye başvurarak her bir önemli etkinlikle ilgili bilgileri alabilirsiniz.

Bir tuş vuruşu iki önemli etkinlik gönderir. Bunlardan biri kullanıcı tuşa bastığında, diğeri ise tuşa basıldığında tetiklenir. KeyEvent nesnesinin type özelliğine başvurarak iki önemli etkinliği ayırt edebilirsiniz.

onKeyEvent lambda işlevinin döndürdüğü değer, önemli etkinliğin işlenmiş olup olmadığını belirtir. Uygulamanız önemli etkinliği ele alıyorsa true döndürün. Bu durumda etkinliğin yayılması durdurulur.

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

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

Değiştirici tuşlar

Bir KeyEvent nesnesi, aşağıdakileri belirten şu özelliklere sahiptir: değiştirici tuşlara basılıp basılmadığını kontrol edin:

Uygulamanızın işlediği önemli etkinlikleri açıklarken net olun. Aşağıdaki snippet bir doSomething() işlevini çağırır yalnızca kullanıcı S tuşunu serbest bırakırsa. Kullanıcı herhangi bir değiştirici tuşa basarsa Üst Karakter tuşuna basıldığında, uygulama bu 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 tuşu ve Enter tuşu tıklama etkinlikleri

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

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

clickable değiştiricisi önemli etkinliklere müdahale eder ve Boşluk tuşu veyaonClick() Enter tuşuna basıldı. Bu nedenle, snippet'te Boşluk veya Enter tuşuna basarak togglePausePlay() işlevi çağrılır.

Kullanılmayan önemli etkinlikler

Tüketilmeyen önemli etkinlikler bileşenden yayılır olayın meydana geldiği dış bileşendir. Aşağıdaki örnekte, InnerComponent, S anahtarı yayınlandığında önemli etkinlikleri tüketir. Bu nedenle OuterComponent, S anahtarı yayınlanarak tetiklenen önemli etkinlikleri almaz. Bu nedenle actionB() işlevi hiçbir zaman çağrılmaz.

InnerComponent ile ilgili diğer önemli etkinlikler (ör. D tuşunun kullanımı, OuterComponent tarafından işlenebilir. actionC() işlevi, D anahtarı serbest bırakma işlemi OuterComponent öğesine aktarı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 önemli bir etkinliğe müdahale etmek önce uygulamanız gerekir. TextField'ye özel kısayollar eklemek bunlardan biridir. Aşağıdaki snippet, kullanıcıların sekme tuşuna basarak odaklanabilir 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, önemli etkinlik onKeyEvent değiştiricisiyle ele alınsa bile kullanıcılar Tab tuşuna her basışında bir sekme karakteri ekler. Sekme karakteri eklemeden klavye odağını taşımak için önemli etkinlikle ilişkili işlemleri tetiklemeden önce önemli etkinliği işleyin (snippet'te olduğu gibi). onKeyPreviewEvent() lambda işlevi, true döndürerek önemli etkinliği durdurur.

Ebeveyn bileşen, alt bileşenlerinde gerçekleşen önemli etkinliği durdurabilir. 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")
  }
}

Box bileşeni için onPreviewKeyEvent() lambda'sı tetiklenmedi Kullanıcılar Sekme tuşuna da bastığında. onPreviewKeyEvent() lambda, ilk olarak üst bileşende çağrılır. alt bileşende onPreviewKeyEvent() çağrılır. Bu davranıştan yararlanarak ekran genelinde klavye kısayolları uygulayabilirsiniz.

Ek kaynaklar