আলাদা করা যায় এমন কীবোর্ড ম্যানেজমেন্ট

থ্রি স্টার রেটিং আইকন

ডিটাচেবল কীবোর্ড কাজ করে বলে বড় স্ক্রিনের ডিভাইসে ব্যবহারকারীর প্রোডাক্টিভিটি সর্বাধিক করা যায়। কোনও ডিভাইসে কীবোর্ড অ্যাটাচ বা ডিটাচ করা হলে, Android প্রতিবারই কনফিগারেশন পরিবর্তন করে। এর ফলে UI স্টেট হারিয়ে যেতে পারে। আপনার অ্যাপ হয় এর স্টেট সেভ ও রিস্টোর করতে পারে, এর ফলে সিস্টেম অ্যাক্টিভিটি রিক্রিয়েশন ম্যানেজ করতে পারে অথবা কীবোর্ড কনফিগারেশন পরিবর্তনের জন্য অ্যাক্টিভিটি রিক্রিয়েশন সীমাবদ্ধ করতে পারে।

সব ক্ষেত্রেই, কীবোর্ড সম্পর্কিত সব ডেটা একটি Configuration অবজেক্টে স্টোর করা হয়। কনফিগারেশন অবজেক্টের keyboard এবং keyboardHidden ফিল্ডে কীবোর্ডের ধরন ও উপলভ্যতা সংক্রান্ত তথ্য থাকে।

পেশাদার পদ্ধতি

বড় স্ক্রিনের জন্য অপ্টিমাইজ করা অ্যাপে সফ্টওয়্যার ও হার্ডওয়্যার কীবোর্ড থেকে শুরু করে স্টাইলাস, মাউস, ট্র্যাকপ্যাড ও অন্যান্য পেরিফেরাল ডিভাইস সহ সব ধরনের ইনপুট ডিভাইস কাজ করে।

এক্সটার্নাল কীবোর্ড কাজ করার জন্য কনফিগারেশনে পরিবর্তন করতে হয়, যা আপনি দুটি উপায়ের মধ্যে যেকোনও একটিতে ম্যানেজ করতে পারবেন:

  1. সিস্টেমকে রানিং অ্যাক্টিভিটি আবার তৈরি করতে দিন এবং আপনি নিজের অ্যাপের স্টেট ম্যানেজ করার বিষয়টি দেখুন।
  2. কনফিগারেশন পরিবর্তন নিজে ম্যানেজ করুন (অ্যাক্টিভিটি আবার তৈরি করা হবে না):
    • কীবোর্ড সম্পর্কিত সব কনফিগারেশন ভ্যালু ঘোষণা করা
    • কনফিগারেশন পরিবর্তন হ্যান্ডলার তৈরি করা

প্রোডাক্টিভিটি অ্যাপে টেক্সট লেখা ও অন্যান্য ইনপুটের জন্য UI-এর উপর সূক্ষ্ম নিয়ন্ত্রণ প্রয়োজন হয়। কনফিগারেশন পরিবর্তন ম্যানেজ করার জন্য 'নিজেই করুন' পদ্ধতি ব্যবহার করলে এইসব অ্যাপ উপকৃত হতে পারে।

বিশেষ কিছু ক্ষেত্রে, হার্ডওয়্যার কীবোর্ড অ্যাটাচ বা ডিটাচ করা হলে, আপনি হয়ত অ্যাপ লেআউট পরিবর্তন করতে চান, যেমন, টুল বা এডিটিং উইন্ডোর জন্য আরও জায়গা তৈরি করতে।

Jetpack Compose-এ, আপনি দুটি উপায়ে কীবোর্ড কনফিগারেশন পরিবর্তনের ব্যাপারে প্রতিক্রিয়া জানাতে পারবেন:

  1. রিঅ্যাক্টিভ UI: LocalConfiguration.current ব্যবহার করে আপনার কম্পোজেবল থেকে সরাসরি বর্তমান কনফিগারেশন স্টেট পড়ুন। কীবোর্ড অ্যাটাচ বা ডিটাচ করা হলে, UI অটোমেটিক নতুন স্টেটের সাথে মানিয়ে নিতে আবার কম্পোজ হয়।
  2. পার্শ্ব-প্রতিক্রিয়া কলব্যাক: হোস্ট অ্যাক্টিভিটিতে কনফিগারেশন পরিবর্তন লিসনার রেজিস্টার করতে লাইফসাইকেল-সচেতন DisposableEffect ব্যবহার করুন, যা আপনাকে অ্যাক্টিভিটি রিক্রিয়েট না করেই বা কোনও ডামি ভিউ এলিমেন্ট ইনস্ট্যানশিয়েট না করেই নন-UI ইভেন্ট (যেমন, লগিং বা অ্যানালিটিক্স) ট্রিগার করতে দেয়।

উপাদান

  • android:configChanges: অ্যাপ ম্যানিফেস্টের <activity> এলিমেন্টের অ্যাট্রিবিউট। অ্যাপ ম্যানেজ করে এমন কনফিগারেশন পরিবর্তন সম্পর্কে সিস্টেমকে জানায়।
  • LocalConfiguration: কম্পোজ করা যায় এমন লোকাল প্রোভাইডার যা বর্তমান ডিভাইস Configuration দেখায়।
  • DisposableEffect: কম্পোজ সাইড-ইফেক্ট API যা কোনও কম্পোজ করার মতো আইটেম কম্পোজিশনে প্রবেশ করলে কোডের একটি ব্লক রান করায় এবং সেটি বেরিয়ে গেলে ক্লিন-আপ করে।

ধাপ

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
    }

  • বিকল্প খ: পার্শ্বপ্রতিক্রিয়া লিসনার

    কনফিগারেশন পরিবর্তন হলে, আপনাকে যদি কোনও সাইড-ইফেক্ট (যেমন, লগ করা, লোকাল ডেটাবেস আপডেট করা বা অ্যানালিটিক্স ট্রিগার করা) চালাতে হয়, তাহলে DisposableEffect ব্যবহার করে হোস্টের উপর কনফিগারেশন পরিবর্তন লিসনার রেজিস্টার করুন ComponentActivity।

    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 স্টেট সেভ করুন দেখুন।