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

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

ডিটাচেবল কীবোর্ডের জন্য সহায়তা, বড় স্ক্রিনের ডিভাইসে ব্যবহারকারীর প্রোডাক্টিভিটি সর্বাধিক করতে সাহায্য করে। প্রতিবার ডিভাইসে কীবোর্ড অ্যাটাচ বা ডিটাচ করা হলে, 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 আপডেট করছেন নাকি সাইড-এফেক্ট কলব্যাক এক্সিকিউট করছেন তার উপর নির্ভর করে নিম্নলিখিত বিকল্পগুলির মধ্যে একটি ব্যবহার করুন:

  • বিকল্প ক: রিঅ্যাক্টিভ 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 স্টেট সেভ করুন দেখুন।