कीबोर्ड से जुड़ी कार्रवाइयां मैनेज करना

जब उपयोगकर्ता, बदलाव किए जा सकने वाले टेक्स्ट कॉम्पोनेंट, जैसे कि TextField पर फ़ोकस करता है और डिवाइस में हार्डवेयर कीबोर्ड जुड़ा होता है, तो सभी इनपुट को सिस्टम मैनेज करता है. की-इवेंट को मैनेज करके, कीबोर्ड शॉर्टकट दिए जा सकते हैं.

डिफ़ॉल्ट कीबोर्ड शॉर्टकट

निम्न कीबोर्ड शॉर्टकट शानदार तरीके से उपलब्ध हैं.

कीबोर्ड शॉर्टकट कार्रवाई शॉर्टकट के साथ काम करने वाले कंपोज़ेबल
Shift+Ctrl+लेफ़्ट ऐरो/राइट ऐरो शब्द की शुरुआत/आखिर तक का टेक्स्ट चुनना BasicTextField, TextField
Shift+Ctrl+ऊपर तीर/नीचे तीर पैराग्राफ़ के शुरू/आखिर तक के टेक्स्ट को चुनें BasicTextField, TextField
Shift+Alt+अप ऐरो/डाउन ऐरो या Shift+Meta+लेफ़्ट ऐरो/राइट ऐरो टेक्स्ट के शुरू/आखिर तक का टेक्स्ट चुनें BasicTextField, TextField
Shift+लेफ़्ट ऐरो/राइट ऐरो वर्ण चुनें BasicTextField, TextField
Ctrl+A सभी चुनें BasicTextField, TextField
Ctrl+C/Ctrl+X/Ctrl+V कॉपी करना, काटना, और चिपकाना BasicTextField, TextField
Ctrl+Z/Ctrl+Shift+Z पहले जैसा करें/फिर से करें BasicTextField, TextField
PageDown/PageUp स्क्रोल करें LazyColumn, verticalScroll मॉडिफ़ायर, scrollable कार्रवाई बदलने वाली कुंजी

महत्वपूर्ण इवेंट

Compose में, onKeyEvent मॉडिफ़ायर की मदद से, किसी एक कीस्ट्रोक को मैनेज किया जा सकता है. यह कार्रवाई बदलने वाली कुंजी, Lambda फ़ंक्शन को स्वीकार करती है, जिसे जब बदले गए कॉम्पोनेंट को कोई मुख्य इवेंट मिलता है. मुख्य इवेंट को KeyEvent ऑब्जेक्ट के तौर पर दिखाया जाता है. ऑब्जेक्ट का रेफ़रंस देकर, हर मुख्य इवेंट की जानकारी पाई जा सकती है लैम्डा में, onKeyEvent मॉडिफ़ायर को पास किया गया है.

एक कीस्ट्रोक दो मुख्य इवेंट भेजता है. जब उपयोगकर्ता बटन दबाता है, तो एक ट्रिगर होता है; जब बटन छोड़ा जाता है, तो दूसरा ट्रिगर होता है. दो मुख्य इवेंट में अंतर किया जा सकता है यह देखने के लिए, KeyEvent ऑब्जेक्ट के type एट्रिब्यूट का इस्तेमाल करें.

onKeyEvent lambda फ़ंक्शन की रिटर्न वैल्यू से पता चलता है कि मुख्य इवेंट को मैनेज किया गया है या नहीं. अगर आपका ऐप्लिकेशन मुख्य इवेंट को मैनेज करता है, तो true लौटाएं, जो इवेंट को प्रसारित होने से रोक देती है.

नीचे दिया गया स्निपेट doSomething() फ़ंक्शन को कॉल करने का तरीका बताता है जब उपयोगकर्ता Box कॉम्पोनेंट पर S कुंजी रिलीज़ करता है:

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

कार्रवाई बदलने वाली कुंजियां

KeyEvent ऑब्जेक्ट में ये एट्रिब्यूट होते हैं, जिनसे पता चलता है कि कार्रवाई बदलने वाले बटन दबाए गए हैं या नहीं:

अपने ऐप्लिकेशन के मुख्य इवेंट के बारे में साफ़ तौर पर बताएं. नीचे दिया गया स्निपेट, doSomething() फ़ंक्शन को सिर्फ़ तब कॉल करता है, जब उपयोगकर्ता सिर्फ़ S बटन को छोड़ता है. अगर उपयोगकर्ता कार्रवाई बदलने वाली कोई भी कुंजी दबाता है, जैसे कि Shift बटन से, ऐप्लिकेशन फ़ंक्शन को कॉल नहीं करता.

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")
}

Spacebar और 'Enter' बटन पर क्लिक करने से जुड़े इवेंट

Spacebar और Enter बटन भी क्लिक इवेंट को ट्रिगर करते हैं. उदाहरण के लिए, उपयोगकर्ता मीडिया प्लेबैक को टॉगल (चलाएं या रोकें) कर सकते हैं Spacebar या Enter बटन दबाएं क्लिक इवेंट को इस तरह हैंडल करके:

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

clickable मॉडिफ़ायर, मुख्य इवेंट को इंटरसेप्ट करता है और onClick() कॉलबैक को कॉल करता है, जब Spacebar या Enter बटन दबाया गया. इसलिए togglePausePlay() फ़ंक्शन को कॉल किया जाता है इसके लिए, स्निपेट में Spacebar या Enter बटन दबाएं.

इस्तेमाल नहीं किए गए मुख्य इवेंट

जिन मुख्य इवेंट का इस्तेमाल नहीं किया गया है उन्हें उस कॉम्पोनेंट से प्रॉपगेट किया जाता है जहां इवेंट हुआ था. नीचे दिए गए उदाहरण में, InnerComponent मुख्य इवेंट का इस्तेमाल करता है जब S कुंजी रिलीज़ की जाती है, इसलिए, OuterComponent को ट्रिगर किया गया कोई भी मुख्य इवेंट नहीं मिलेगा S कुंजी दबाकर रखें. इसलिए, actionB() फ़ंक्शन को कभी भी कॉल नहीं किया जाता.

InnerComponent पर अन्य मुख्य इवेंट, जैसे कि D बटन को रिलीज़ करना, को OuterComponent की मदद से मैनेज किया जा सकता है. actionC() फ़ंक्शन को इसलिए कॉल किया जाता है, क्योंकि D बटन को रिलीज़ करने के लिए मुख्य इवेंट, OuterComponent पर भेजा जाता है.

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 मॉडिफ़ायर

इस्तेमाल के कुछ मामलों में, आपको किसी मुख्य इवेंट को रोकना है इससे पहले कि वह डिफ़ॉल्ट कार्रवाई ट्रिगर करे. TextField में कस्टम शॉर्टकट जोड़ना एक सामान्य काम है. नीचे दिए गए स्निपेट की मदद से, उपयोगकर्ता tab बटन दबाकर, फ़ोकस किए जा सकने वाले अगले कॉम्पोनेंट पर जा सकते हैं.

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
        }
    }
)

डिफ़ॉल्ट रूप से, TextField कॉम्पोनेंट एक टैब वर्ण जोड़ता है जब भी उपयोगकर्ता Tab बटन को दबाएंगे, भले ही, मुख्य इवेंट को onKeyEvent मॉडिफ़ायर की मदद से हैंडल किया जाता हो. टैब वर्ण जोड़े बिना कीबोर्ड फ़ोकस को दूसरी जगह ले जाने के लिए, स्निपेट में बताए गए तरीके से, मुख्य इवेंट से जुड़ी कार्रवाइयों को ट्रिगर करने से पहले, मुख्य इवेंट को मैनेज करें. onKeyPreviewEvent() लैम्ब्डा, true दिखाकर मुख्य इवेंट को इंटरसेप्ट करता है.

पैरंट कॉम्पोनेंट, अपने चाइल्ड कॉम्पोनेंट पर होने वाले मुख्य इवेंट को इंटरसेप्ट कर सकता है. नीचे दिए गए स्निपेट में, previewSKey() फ़ंक्शन को कॉल किया जाता है जब उपयोगकर्ता S बटन दबाते हैं, ताकि actionForPreview() फ़ंक्शन को कॉल किया जा सके.

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")
  }
}

जब उपयोगकर्ता Tab बटन दबाते हैं, तब भी Box कॉम्पोनेंट के लिए onPreviewKeyEvent() लैम्ब्डा ट्रिगर नहीं होता. onPreviewKeyEvent() लैम्डा को पहले पैरंट कॉम्पोनेंट पर कॉल किया जाता है, इसके बाद, चाइल्ड कॉम्पोनेंट में onPreviewKeyEvent() को कॉल किया जाता है. इस सुविधा का इस्तेमाल करके, स्क्रीन पर कहीं भी काम करने के लिए कीबोर्ड शॉर्टकट लागू किए जा सकते हैं.

अन्य संसाधन

  • कीबोर्ड शॉर्टकट हेल्पर: वह सिस्टम स्क्रीन इस सुविधा से उपयोगकर्ता आपके ऐप्लिकेशन में मौजूद कीबोर्ड शॉर्टकट खोज सकते हैं.