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

ব্যবহারকারী যখন এডিট করা যায় এমন টেক্সট কম্পোনেন্টে ফোকাস করেন, যেমন 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 মডিফায়ার

কী ইভেন্ট

কম্পোজ করার সময়, আপনি 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 অবজেক্টে নিম্নলিখিত অ্যাট্রিবিউট আছে যা মডিফায়ার কী প্রেস করা হয়েছে কিনা তা নির্দেশ করে:

আপনার অ্যাপ যেসব মূল ইভেন্ট ম্যানেজ করে সেগুলির বিবরণ নির্দিষ্ট করে দিন। ব্যবহারকারী শুধুমাত্র S কী রিলিজ করলে, নিচের স্নিপেট doSomething() ফাংশন কল করে। ব্যবহারকারী 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 দ্বারা ম্যানেজ করা যেতে পারে। D কী রিলিজ করার জন্য কী ইভেন্ট OuterComponent-এ প্রোপাগেট করা হয় বলে actionC() ফাংশন কল করা হয়।

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

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

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

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