কীবোর্ড অ্যাকশন পরিচালনা করুন

যখন ব্যবহারকারী একটি সম্পাদনাযোগ্য পাঠ্য উপাদানে ফোকাস দেয়, যেমন একটি TextField , এবং ডিভাইসটিতে একটি হার্ডওয়্যার কীবোর্ড সংযুক্ত থাকে, তখন সমস্ত ইনপুট সিস্টেম দ্বারা পরিচালিত হয়। আপনি মূল ইভেন্টগুলি পরিচালনা করে কীবোর্ড শর্টকাট প্রদান করতে পারেন।

ডিফল্ট কীবোর্ড শর্টকাট

নিম্নলিখিত কীবোর্ড শর্টকাটগুলি বাক্সের বাইরে উপলব্ধ৷

কীবোর্ড শর্টকাট অ্যাকশন কম্পোজেবল শর্টকাট সমর্থন করে
Shift + Ctrl + বাম তীর / ডান তীর শব্দের শুরু/শেষে পাঠ্য নির্বাচন করুন BasicTextField , TextField
Shift + Ctrl + উপরের তীর / নিচের তীর অনুচ্ছেদের শুরু/শেষে পাঠ্য নির্বাচন করুন BasicTextField , TextField
Shift + Alt + উপরের তীর / নিচের তীর বা Shift + Meta + বাম তীর / ডান তীর পাঠ্যের শুরু/শেষে পাঠ্য নির্বাচন করুন BasicTextField , TextField
শিফট + বাম তীর / ডান তীর অক্ষর নির্বাচন করুন BasicTextField , TextField
Ctrl + A সব নির্বাচন করুন BasicTextField , TextField
Ctrl + C / Ctrl + X / Ctrl + V কপি/কাট/পেস্ট করুন BasicTextField , TextField
Ctrl + Z / Ctrl + Shift + Z পূর্বাবস্থায় ফেরান BasicTextField , TextField
পেজডাউন / পেজআপ স্ক্রল করুন LazyColumn , verticalScroll সংশোধক, scrollable সংশোধক

মূল ঘটনা

রচনায়, আপনি onKeyEvent সংশোধকের সাথে একটি পৃথক কীস্ট্রোক পরিচালনা করতে পারেন। সংশোধক একটি ল্যাম্বডা গ্রহণ করে যাকে বলা হয় যখন পরিবর্তিত উপাদান একটি মূল ইভেন্ট গ্রহণ করে। একটি কী ইভেন্টকে 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 কী প্রকাশ করে। ব্যবহারকারী যদি শিফট কী-এর মতো কোনো পরিবর্তনকারী কী চাপেন, তাহলে অ্যাপটি ফাংশনটিকে কল করে না।

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

স্পেসবার এবং এন্টার কী ক্লিক ইভেন্ট

স্পেসবার এবং এন্টার কী ট্রিগার ক্লিক ইভেন্টগুলিও। উদাহরণস্বরূপ, ব্যবহারকারীরা স্পেসবার বা এন্টার কী দিয়ে মিডিয়া প্লেব্যাককে টগল (প্লে বা পজ) করতে পারেন নিচের মত ক্লিক ইভেন্টগুলি পরিচালনা করে:

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

স্পেসবার বা এন্টার কী চাপলে clickable মডিফায়ার কী ইভেন্টগুলিকে বাধা দেয় এবং onClick() কলব্যাককে কল করে। তাই স্নিপেটে স্পেসবার বা এন্টার কী টিপে togglePausePlay() ফাংশনটি কল করা হয়।

অব্যবহৃত মূল ঘটনা

অব্যবহৃত মূল ঘটনাগুলি সেই উপাদান থেকে প্রচার করা হয় যেখানে ঘটনাটি ঘেরা বাইরের উপাদানে ঘটেছে। নীচের উদাহরণে, S কী রিলিজ হলে InnerComponent কী ইভেন্টগুলিকে গ্রাস করে, এবং তাই 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 কাস্টম শর্টকাট যোগ করা একটি সাধারণ বিষয়। নিম্নলিখিত স্নিপেট ব্যবহারকারীদের ট্যাব কী টিপে পরবর্তী ফোকাসযোগ্য উপাদানে যেতে সক্ষম করে।

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 উপাদানটি প্রতিবার ব্যবহারকারীরা ট্যাব কী টিপে একটি ট্যাব অক্ষর যোগ করে, এমনকি যদি কী ইভেন্টটি onKeyEvent মডিফায়ার দিয়ে পরিচালনা করা হয়। কোন ট্যাব অক্ষর যোগ না করে কীবোর্ড ফোকাস সরাতে, স্নিপেটের মতো কী ইভেন্টের সাথে যুক্ত অ্যাকশন ট্রিগার করার আগে কী ইভেন্টটি পরিচালনা করুন। onKeyPreviewEvent() lambda মূল ইভেন্টটি 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")
  }
}

ব্যবহারকারীরা ট্যাব কী চাপলে Box উপাদানের জন্য onPreviewKeyEvent() lambda ট্রিগার হয় না। onPreviewKeyEvent() lambda কে প্রথমে প্যারেন্ট কম্পোনেন্টে কল করা হয়, তারপর চাইল্ড কম্পোনেন্টে onPreviewKeyEvent() বলা হয়। আপনি এই আচরণটি ব্যবহার করে স্ক্রীন-ওয়াইড কীবোর্ড শর্টকাট বাস্তবায়ন করতে পারেন।

অতিরিক্ত সম্পদ

  • কীবোর্ড শর্টকাট হেল্পার : সিস্টেম স্ক্রিন যা ব্যবহারকারীদের আপনার অ্যাপের অফার কীবোর্ড শর্টকাট অনুসন্ধান করতে সক্ষম করে।
,

যখন ব্যবহারকারী একটি সম্পাদনাযোগ্য পাঠ্য উপাদানে ফোকাস দেয়, যেমন একটি TextField , এবং ডিভাইসটিতে একটি হার্ডওয়্যার কীবোর্ড সংযুক্ত থাকে, তখন সমস্ত ইনপুট সিস্টেম দ্বারা পরিচালিত হয়। আপনি মূল ইভেন্টগুলি পরিচালনা করে কীবোর্ড শর্টকাট প্রদান করতে পারেন।

ডিফল্ট কীবোর্ড শর্টকাট

নিম্নলিখিত কীবোর্ড শর্টকাটগুলি বাক্সের বাইরে উপলব্ধ৷

কীবোর্ড শর্টকাট অ্যাকশন কম্পোজেবল শর্টকাট সমর্থন করে
Shift + Ctrl + বাম তীর / ডান তীর শব্দের শুরু/শেষে পাঠ্য নির্বাচন করুন BasicTextField , TextField
Shift + Ctrl + উপরের তীর / নিচের তীর অনুচ্ছেদের শুরু/শেষে পাঠ্য নির্বাচন করুন BasicTextField , TextField
Shift + Alt + উপরের তীর / নিচের তীর বা Shift + Meta + বাম তীর / ডান তীর পাঠ্যের শুরু/শেষে পাঠ্য নির্বাচন করুন BasicTextField , TextField
শিফট + বাম তীর / ডান তীর অক্ষর নির্বাচন করুন BasicTextField , TextField
Ctrl + A সব নির্বাচন করুন BasicTextField , TextField
Ctrl + C / Ctrl + X / Ctrl + V কপি/কাট/পেস্ট করুন BasicTextField , TextField
Ctrl + Z / Ctrl + Shift + Z পূর্বাবস্থায় ফেরান BasicTextField , TextField
পেজডাউন / পেজআপ স্ক্রল করুন LazyColumn , verticalScroll সংশোধক, scrollable সংশোধক

মূল ঘটনা

রচনায়, আপনি onKeyEvent সংশোধকের সাথে একটি পৃথক কীস্ট্রোক পরিচালনা করতে পারেন। সংশোধক একটি ল্যাম্বডা গ্রহণ করে যাকে বলা হয় যখন পরিবর্তিত উপাদান একটি মূল ইভেন্ট গ্রহণ করে। একটি কী ইভেন্টকে 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 কী প্রকাশ করে। ব্যবহারকারী যদি শিফট কী-এর মতো কোনো পরিবর্তনকারী কী চাপেন, তাহলে অ্যাপটি ফাংশনটিকে কল করে না।

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

স্পেসবার এবং এন্টার কী ক্লিক ইভেন্ট

স্পেসবার এবং এন্টার কী ট্রিগার ক্লিক ইভেন্টগুলিও। উদাহরণস্বরূপ, ব্যবহারকারীরা স্পেসবার বা এন্টার কী দিয়ে মিডিয়া প্লেব্যাককে টগল (প্লে বা পজ) করতে পারেন নিচের মত ক্লিক ইভেন্টগুলি পরিচালনা করে:

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

স্পেসবার বা এন্টার কী চাপলে clickable মডিফায়ার কী ইভেন্টগুলিকে বাধা দেয় এবং onClick() কলব্যাককে কল করে। তাই স্নিপেটে স্পেসবার বা এন্টার কী টিপে togglePausePlay() ফাংশনটি কল করা হয়।

অব্যবহৃত মূল ঘটনা

অব্যবহৃত মূল ঘটনাগুলি সেই উপাদান থেকে প্রচার করা হয় যেখানে ঘটনাটি ঘেরা বাইরের উপাদানে ঘটেছে। নীচের উদাহরণে, S কী রিলিজ হলে InnerComponent কী ইভেন্টগুলিকে গ্রাস করে, এবং তাই 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 কাস্টম শর্টকাট যোগ করা একটি সাধারণ বিষয়। নিম্নলিখিত স্নিপেট ব্যবহারকারীদের ট্যাব কী টিপে পরবর্তী ফোকাসযোগ্য উপাদানে যেতে সক্ষম করে।

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 উপাদানটি প্রতিবার ব্যবহারকারীরা ট্যাব কী টিপে একটি ট্যাব অক্ষর যোগ করে, এমনকি যদি কী ইভেন্টটি onKeyEvent মডিফায়ার দিয়ে পরিচালনা করা হয়। কোন ট্যাব অক্ষর যোগ না করে কীবোর্ড ফোকাস সরাতে, স্নিপেটের মতো কী ইভেন্টের সাথে যুক্ত অ্যাকশন ট্রিগার করার আগে কী ইভেন্টটি পরিচালনা করুন। onKeyPreviewEvent() lambda মূল ইভেন্টটি 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")
  }
}

ব্যবহারকারীরা ট্যাব কী চাপলে Box উপাদানের জন্য onPreviewKeyEvent() lambda ট্রিগার হয় না। onPreviewKeyEvent() lambda কে প্রথমে প্যারেন্ট কম্পোনেন্টে কল করা হয়, তারপর চাইল্ড কম্পোনেন্টে onPreviewKeyEvent() বলা হয়। আপনি এই আচরণটি ব্যবহার করে স্ক্রীন-ওয়াইড কীবোর্ড শর্টকাট বাস্তবায়ন করতে পারেন।

অতিরিক্ত সম্পদ

  • কীবোর্ড শর্টকাট হেল্পার : সিস্টেম স্ক্রিন যা ব্যবহারকারীদের আপনার অ্যাপের অফার কীবোর্ড শর্টকাট অনুসন্ধান করতে সক্ষম করে।