যখন ব্যবহারকারী একটি সম্পাদনাযোগ্য পাঠ্য উপাদানে ফোকাস দেয়, যেমন একটি 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()
বলা হয়। আপনি এই আচরণটি ব্যবহার করে স্ক্রীন-ওয়াইড কীবোর্ড শর্টকাট বাস্তবায়ন করতে পারেন।
অতিরিক্ত সম্পদ
- কীবোর্ড শর্টকাট হেল্পার : সিস্টেম স্ক্রিন যা ব্যবহারকারীদের আপনার অ্যাপের অফার কীবোর্ড শর্টকাট অনুসন্ধান করতে সক্ষম করে।