
বিচ্ছিন্নযোগ্য কিবোর্ডের সমর্থন বড় স্ক্রিনের ডিভাইসগুলিতে ব্যবহারকারীর কর্মদক্ষতা বাড়াতে সাহায্য করে। প্রতিবার কোনো ডিভাইসে কিবোর্ড সংযুক্ত বা বিচ্ছিন্ন করা হলে অ্যান্ড্রয়েড একটি কনফিগারেশন পরিবর্তন ঘটায়, যার ফলে UI-এর অবস্থা নষ্ট হয়ে যেতে পারে। আপনার অ্যাপ তার অবস্থা সংরক্ষণ ও পুনরুদ্ধার করতে পারে, যার ফলে সিস্টেম অ্যাক্টিভিটি পুনরায় তৈরি করার কাজটি করতে পারে, অথবা কিবোর্ড কনফিগারেশন পরিবর্তনের জন্য অ্যাক্টিভিটি পুনরায় তৈরি করা সীমাবদ্ধ করতে পারে ।
সকল ক্ষেত্রে কিবোর্ড সম্পর্কিত সমস্ত ডেটা একটি Configuration অবজেক্টে সংরক্ষিত থাকে। কনফিগারেশন অবজেক্টের keyboard এবং keyboardHidden ফিল্ডগুলিতে কিবোর্ডের ধরন এবং এর প্রাপ্যতা সম্পর্কিত তথ্য থাকে।
সর্বোত্তম অনুশীলন
বড় পর্দার জন্য অপ্টিমাইজ করা অ্যাপগুলো সফটওয়্যার ও হার্ডওয়্যার কিবোর্ড থেকে শুরু করে স্টাইলাস, মাউস, ট্র্যাকপ্যাড এবং অন্যান্য পেরিফেরাল ডিভাইস পর্যন্ত সব ধরনের ইনপুট ডিভাইস সমর্থন করে।
বাহ্যিক কিবোর্ড ব্যবহারের জন্য কনফিগারেশনে পরিবর্তন আনতে হয়, যা আপনি দুটি উপায়ের যেকোনো একটিতে করতে পারেন:
- সিস্টেমকে চলমান অ্যাক্টিভিটিটি পুনরায় তৈরি করতে দিন, আর আপনি আপনার অ্যাপের অবস্থা ব্যবস্থাপনার দায়িত্ব নিন।
- কনফিগারেশন পরিবর্তনটি নিজেই পরিচালনা করুন (অ্যাক্টিভিটিটি পুনরায় তৈরি করা হবে না):
- কিবোর্ড-সম্পর্কিত সমস্ত কনফিগারেশন মান ঘোষণা করুন
- একটি কনফিগারেশন পরিবর্তন হ্যান্ডলার তৈরি করুন
প্রোডাক্টিভিটি অ্যাপগুলো, যেগুলোতে প্রায়শই টেক্সট এন্ট্রি এবং অন্যান্য ইনপুটের জন্য ইউআই-এর সূক্ষ্ম নিয়ন্ত্রণের প্রয়োজন হয়, সেগুলোর ক্ষেত্রে কনফিগারেশন পরিবর্তন নিজে থেকে করার পদ্ধতিটি উপকারী হতে পারে।
বিশেষ ক্ষেত্রে, হার্ডওয়্যার কীবোর্ড সংযুক্ত বা বিচ্ছিন্ন করার সময় আপনি আপনার অ্যাপের লেআউট পরিবর্তন করতে চাইতে পারেন, উদাহরণস্বরূপ, টুলস বা এডিটিং উইন্ডোগুলোর জন্য আরও জায়গা তৈরি করতে।
Jetpack Compose-এ, আপনি কিবোর্ড কনফিগারেশনের পরিবর্তনে দুইভাবে প্রতিক্রিয়া জানাতে পারেন:
- রিঅ্যাক্টিভ UI:
LocalConfiguration.currentব্যবহার করে আপনার Composable-গুলোতে সরাসরি বর্তমান কনফিগারেশন অবস্থা পড়ুন। যখন একটি কীবোর্ড সংযুক্ত বা বিচ্ছিন্ন করা হয়, তখন UI স্বয়ংক্রিয়ভাবে নতুন অবস্থার সাথে খাপ খাইয়ে নিতে পুনরায় গঠিত হয়। - সাইড-ইফেক্ট কলব্যাক: হোস্ট অ্যাক্টিভিটিতে একটি কনফিগারেশন পরিবর্তন লিসেনার রেজিস্টার করতে একটি লাইফসাইকেল-অ্যাওয়ার
DisposableEffectব্যবহার করুন, যা আপনাকে অ্যাক্টিভিটি পুনরায় তৈরি না করে বা কোনো ডামি ভিউ এলিমেন্ট ইনস্ট্যানশিয়েট না করেই নন-ইউআই ইভেন্ট (যেমন লগিং বা অ্যানালিটিক্স) ট্রিগার করতে দেয়।
উপকরণ
-
android:configChanges: অ্যাপ ম্যানিফেস্টের<activity>এলিমেন্টের অ্যাট্রিবিউট। অ্যাপ দ্বারা পরিচালিত কনফিগারেশন পরিবর্তন সম্পর্কে সিস্টেমকে অবহিত করে। -
LocalConfiguration: কম্পোজেবল লোকাল প্রোভাইডার যা বর্তমান ডিভাইসConfigurationপ্রকাশ করে। -
DisposableEffect: কম্পোজের একটি সাইড-ইফেক্ট এপিআই, যা কোনো Composable কম্পোজিশনে প্রবেশ করলে একটি কোড ব্লক রান করে এবং কম্পোজিশন থেকে বেরিয়ে গেলে তা পরিষ্কার করে দেয়।
পদক্ষেপ
অ্যাক্টিভিটি পুনরায় তৈরি হওয়া রোধ করতে configChanges অ্যাট্রিবিউটটি ডিক্লেয়ার করুন এবং কিবোর্ড-সম্পর্কিত ভ্যালু যোগ করুন। এরপর, আপনার কম্পোজেবল লেআউটকে ডাইনামিকভাবে মানিয়ে নিতে LocalConfiguration.current ব্যবহার করুন, অথবা DisposableEffect ব্যবহার করে একটি কনফিগারেশন লিসেনার রেজিস্টার করুন।
১. configChanges অ্যাট্রিবিউট ঘোষণা করুন
ইতিমধ্যে পরিচালিত কনফিগারেশন পরিবর্তনের তালিকায় keyboard|keyboardHidden ভ্যালুগুলো যোগ করে অ্যাপ ম্যানিফেস্টের <activity> এলিমেন্টটি আপডেট করুন:
<activity
…
android:configChanges="...|keyboard|keyboardHidden">
২. কীবোর্ড কনফিগারেশন পরিবর্তনে সাড়া দিন
Jetpack Compose-এ কনফিগারেশন পরিবর্তন পরিচালনা করতে, আপনি UI আপডেট করছেন নাকি কোনো সাইড-ইফেক্ট কলব্যাক এক্সিকিউট করছেন, তার উপর নির্ভর করে নিম্নলিখিত অপশনগুলোর মধ্যে একটি ব্যবহার করুন:
বিকল্প A: প্রতিক্রিয়াশীল UI (সুপারিশকৃত)
LocalConfiguration.currentথেকে সরাসরি কিবোর্ডের ধরনটি পড়ুন। যখন একটি হার্ডওয়্যার কিবোর্ড সংযুক্ত বা বিচ্ছিন্ন করা হয়, তখন এই মানটি পরিবর্তিত হয় এবং Compose স্বয়ংক্রিয়ভাবে আপনার UI পুনর্গঠন করে।val configuration = LocalConfiguration.current val isPhysicalKeyboardAttached = configuration.keyboard == Configuration.KEYBOARD_QWERTY if (isPhysicalKeyboardAttached) { // Render layout optimized for physical keyboard } else { // Render default layout }
বিকল্প বি: পার্শ্ব-প্রতিক্রিয়া শ্রোতা
কনফিগারেশন পরিবর্তনের ফলে যদি কোনো সাইড-ইফেক্ট (যেমন লগিং, লোকাল ডেটাবেস আপডেট করা, বা অ্যানালিটিক্স চালু করা) চালানোর প্রয়োজন হয়, তাহলে হোস্ট
ComponentActivityতে একটি কনফিগারেশন চেঞ্জ লিসেনার রেজিস্টার করতে একটিDisposableEffectব্যবহার করুন।val context = LocalActivity.current DisposableEffect(context) { val activity = context as? ComponentActivity val listener = Consumer<Configuration> { newConfig -> val hasKeyboard = newConfig.keyboard == Configuration.KEYBOARD_QWERTY // Trigger non-UI actions, analytics, etc. } activity?.addOnConfigurationChangedListener(listener) onDispose { activity?.removeOnConfigurationChangedListener(listener) } }
ফলাফল
আপনার অ্যাপটি এখন চলমান অ্যাক্টিভিটিটি পুনরায় তৈরি না করেই একটি বাহ্যিক কীবোর্ড সংযুক্ত বা বিচ্ছিন্ন করার বিষয়ে সাড়া দেবে।
অতিরিক্ত সম্পদ
কিবোর্ড সংযুক্তি বা বিচ্ছিন্নকরণের মতো কনফিগারেশন পরিবর্তনের সময় আপনার অ্যাপের UI অবস্থা কীভাবে সংরক্ষণ করবেন তা জানতে, UI অবস্থা সংরক্ষণ দেখুন।