কীবোর্ড অ্যাকশন ম্যানেজ করা

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

কিস্ট্রোক দুটি মূল ইভেন্ট পাঠায়। ব্যবহারকারী 'কী' প্রেস করলে একটি ট্রিগার হয়; 'কী' রিলিজ করলে অন্যটি ট্রিগার হয়। আপনি KeyEvent অবজেক্টের type অ্যাট্রিবিউট দেখে দুটি মূল ইভেন্ট আলাদা করতে পারবেন।

onKeyEvent ল্যাম্বডার রিটার্ন ভ্যালু থেকে বোঝা যায় যে কী ইভেন্ট ম্যানেজ করা হয়েছে কিনা। আপনার অ্যাপ কী ইভেন্ট ম্যানেজ করলে true রিটার্ন করুন, যা ইভেন্টের প্রচার বন্ধ করে দেয়।

ব্যবহারকারী Box কম্পোনেন্টে S কী রিলিজ করলে কীভাবে doSomething() ফাংশন কল করতে হয় তা নিম্নলিখিত স্নিপেট থেকে বোঝা যায়:

Box(
    modifier = Modifier
        .onKeyEvent {
            if (
                it.type == KeyEventType.KeyUp &&
                it.key == Key.S
            ) {
                doSomething()
                true
            } else {
                false
            }
        }
        .focusable()
) {
    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")
}

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

Spacebar এবং Enter কী ক্লিক ইভেন্টও ট্রিগার করে। যেমন, ব্যবহারকারীরা Spacebar বা Enter কী ব্যবহার করে মিডিয়া প্লেব্যাক টগল (চালানো বা পজ করা) করতে পারবেন এবং এর জন্য নিম্নলিখিত উপায়ে ক্লিক ইভেন্ট ম্যানেজ করতে হবে:

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

clickable মডিফায়ার কী ইভেন্ট ইন্টারসেপ্ট করে এবং Spacebar বা Enter কী প্রেস করা হলে onClick() কলব্যাক কল করে। সেই জন্য, স্নিপেটে Spacebar বা Enter কী প্রেস করে togglePausePlay() ফাংশন কল করা হয়।

ব্যবহার না করা গুরুত্বপূর্ণ ইভেন্ট

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

প্যারেন্ট কম্পোনেন্ট তার চাইল্ড কম্পোনেন্টে হওয়া কী ইভেন্ট ইন্টারসেপ্ট করতে পারে। নিচের স্নিপেটে, ব্যবহারকারী S কী প্রেস করলে, actionForPreview() ফাংশন কল করার পরিবর্তে previewSKey() ফাংশন কল করা হয়।

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() কল করা হয়। এই আচরণ ব্যবহার করে আপনি স্ক্রিন-ওয়াইড কীবোর্ড শর্টকাট প্রয়োগ করতে পারেন।

অতিরিক্ত রিসোর্স

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