আপনার UI উইন্ডো ইনসেটগুলির সাথে কাজ করে তা নিশ্চিত করুন৷

একবার আপনার কার্যকলাপ সমস্ত ইনসেট পরিচালনার নিয়ন্ত্রণ নিয়ে নিলে, আপনি কন্টেন্ট যাতে অস্পষ্ট না হয় এবং ইন্টারঅ্যাক্টেবল উপাদানগুলি সিস্টেম UI এর সাথে ওভারল্যাপ না হয় তা নিশ্চিত করতে আপনি কম্পোজ API ব্যবহার করতে পারেন। এই APIগুলি ইনসেট পরিবর্তনগুলির সাথে আপনার অ্যাপের লেআউটকেও সিঙ্ক্রোনাইজ করে৷

উদাহরণস্বরূপ, এটি আপনার সম্পূর্ণ অ্যাপের সামগ্রীতে ইনসেটগুলি প্রয়োগ করার সবচেয়ে মৌলিক পদ্ধতি:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    enableEdgeToEdge()

    setContent {
        Box(Modifier.safeDrawingPadding()) {
            // the rest of the app
        }
    }
}

এই স্নিপেটটি অ্যাপের সম্পূর্ণ বিষয়বস্তুর চারপাশে প্যাডিং হিসাবে safeDrawing উইন্ডো ইনসেটগুলিকে প্রয়োগ করে৷ যদিও এটি নিশ্চিত করে যে ইন্টারঅ্যাক্টেবল উপাদানগুলি সিস্টেম UI এর সাথে ওভারল্যাপ করে না, এর মানে হল যে কোনও অ্যাপই এজ-টু-এজ ইফেক্ট অর্জন করতে সিস্টেম UI এর পিছনে থাকবে না। সম্পূর্ণ উইন্ডোটির সম্পূর্ণ ব্যবহার করার জন্য, আপনাকে সূক্ষ্ম-টিউন করতে হবে যেখানে ইনসেটগুলি স্ক্রীন-বাই-স্ক্রিন বা উপাদান-দ্বারা-কম্পোনেন্ট ভিত্তিতে প্রয়োগ করা হয়।

এই সমস্ত ইনসেট প্রকারগুলি API 21 এ ব্যাকপোর্ট করা IME অ্যানিমেশনগুলির সাথে স্বয়ংক্রিয়ভাবে অ্যানিমেটেড হয়৷ এক্সটেনশনের মাধ্যমে, এই ইনসেটগুলি ব্যবহার করে আপনার সমস্ত লেআউটগুলিও ইনসেট মান পরিবর্তনের সাথে সাথে স্বয়ংক্রিয়ভাবে অ্যানিমেটেড হয়৷

আপনার কম্পোজযোগ্য লেআউটগুলি সামঞ্জস্য করতে এই ইনসেট প্রকারগুলি ব্যবহার করার দুটি প্রাথমিক উপায় রয়েছে: প্যাডিং সংশোধক এবং ইনসেট আকার সংশোধক৷

প্যাডিং মডিফায়ার

Modifier.windowInsetsPadding(windowInsets: WindowInsets) প্রদত্ত উইন্ডো ইনসেটগুলিকে প্যাডিং হিসাবে প্রয়োগ করে, ঠিক Modifier.padding এর মত কাজ করে। উদাহরণস্বরূপ, Modifier.windowInsetsPadding(WindowInsets.safeDrawing) সমস্ত 4 দিকে প্যাডিং হিসাবে নিরাপদ অঙ্কন ইনসেটগুলি প্রয়োগ করে।

সবচেয়ে সাধারণ ইনসেট ধরনের জন্য বেশ কিছু অন্তর্নির্মিত ইউটিলিটি পদ্ধতি রয়েছে। Modifier.safeDrawingPadding() হল এরকম একটি পদ্ধতি, যা Modifier.windowInsetsPadding(WindowInsets.safeDrawing) এর সমতুল্য। অন্যান্য ইনসেট ধরনের জন্য অনুরূপ পরিবর্তনকারী আছে.

ইনসেট আকার সংশোধক

নিম্নলিখিত সংশোধকগুলি উপাদানের আকারকে ইনসেটগুলির আকার হিসাবে সেট করে উইন্ডো ইনসেটের পরিমাণ প্রয়োগ করে:

Modifier.windowInsetsStartWidth(windowInsets: WindowInsets)

windowInsets এর প্রারম্ভিক দিকটি প্রস্থ হিসাবে প্রয়োগ করে (যেমন Modifier.width )

Modifier.windowInsetsEndWidth(windowInsets: WindowInsets)

প্রস্থ হিসাবে windowInsets এর শেষ দিক প্রয়োগ করে (যেমন Modifier.width )

Modifier.windowInsetsTopHeight(windowInsets: WindowInsets)

windowInsets এর উপরের দিকটি উচ্চতা হিসাবে প্রয়োগ করে (যেমন Modifier.height )

Modifier.windowInsetsBottomHeight(windowInsets: WindowInsets)

windowInsets-এর নীচের দিকটি উচ্চতা হিসাবে প্রয়োগ করে (যেমন Modifier.height )

এই সংশোধকগুলি বিশেষত একটি Spacer আকার দেওয়ার জন্য দরকারী যা ইনসেটের স্থান নেয়:

LazyColumn(
    Modifier.imePadding()
) {
    // Other content
    item {
        Spacer(
            Modifier.windowInsetsBottomHeight(
                WindowInsets.systemBars
            )
        )
    }
}

ইনসেট খরচ

ইনসেট প্যাডিং মডিফায়ার ( windowInsetsPadding এবং safeDrawingPadding মতো সহায়ক) স্বয়ংক্রিয়ভাবে প্যাডিং হিসাবে প্রয়োগ করা ইনসেটের অংশকে গ্রাস করে। কম্পোজিশন ট্রির গভীরে যাওয়ার সময়, নেস্টেড ইনসেট প্যাডিং মডিফায়ার এবং ইনসেট সাইজ মডিফায়াররা জানে যে ইনসেটগুলির কিছু অংশ ইতিমধ্যেই বাইরের ইনসেট প্যাডিং মডিফায়ার দ্বারা গ্রাস করা হয়েছে, এবং ইনসেটগুলির একই অংশ একাধিকবার ব্যবহার করা এড়িয়ে চলুন যার ফলে খুব বেশি অতিরিক্ত স্থান হবে৷

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

ফলস্বরূপ, নেস্টিং প্যাডিং মডিফায়ারগুলি স্বয়ংক্রিয়ভাবে প্রতিটি কম্পোজেবলে প্রয়োগ করা প্যাডিংয়ের পরিমাণ পরিবর্তন করে।

আগের মতো একই LazyColumn উদাহরণের দিকে তাকিয়ে, imePadding সংশোধক দ্বারা LazyColumn আকার পরিবর্তন করা হচ্ছে। LazyColumn এর ভিতরে, শেষ আইটেমটি সিস্টেম বারের নীচের উচ্চতা হিসাবে মাপ করা হয়:

LazyColumn(
    Modifier.imePadding()
) {
    // Other content
    item {
        Spacer(
            Modifier.windowInsetsBottomHeight(
                WindowInsets.systemBars
            )
        )
    }
}

যখন IME বন্ধ থাকে, imePadding() সংশোধক কোনো প্যাডিং প্রয়োগ করে না, যেহেতু IME-এর কোনো উচ্চতা নেই। যেহেতু imePadding() সংশোধক কোনো প্যাডিং প্রয়োগ করছে না, তাই কোনো ইনসেট ব্যবহার করা হচ্ছে না এবং Spacer উচ্চতা হবে সিস্টেম বারের নিচের দিকের মাপ।

যখন IME খোলে, IME IME এর আকারের সাথে মেলে অ্যানিমেট ইনসেট করে এবং imePadding() সংশোধক IME খোলার সাথে সাথে LazyColumn আকার পরিবর্তন করতে নীচের প্যাডিং প্রয়োগ করা শুরু করে। যেহেতু imePadding() সংশোধক নীচের প্যাডিং প্রয়োগ করা শুরু করে, এটি সেই পরিমাণ ইনসেটগুলিও গ্রহণ করতে শুরু করে। অতএব, Spacer উচ্চতা কমতে শুরু করে, কারণ সিস্টেম বারগুলির জন্য ফাঁকের অংশটি ইতিমধ্যেই imePadding() সংশোধক দ্বারা প্রয়োগ করা হয়েছে। একবার imePadding() সংশোধক সিস্টেম বারের চেয়ে বেশি পরিমাণে নীচের প্যাডিং প্রয়োগ করলে, Spacer উচ্চতা শূন্য হয়।

IME বন্ধ হয়ে গেলে, পরিবর্তনগুলি বিপরীতভাবে ঘটে: একবার imePadding() সিস্টেম বারগুলির নীচের দিকের চেয়ে কম প্রয়োগ করার পরে Spacer শূন্যের উচ্চতা থেকে প্রসারিত হতে শুরু করে, যতক্ষণ না শেষ পর্যন্ত Spacer IME সম্পূর্ণ অ্যানিমেটেড হয়ে গেলে সিস্টেম বারগুলির নীচের দিকের উচ্চতার সাথে মেলে।

চিত্র 2. TextField সহ এজ-টু-এজ অলস কলাম।

এই আচরণটি সমস্ত windowInsetsPadding সংশোধকদের মধ্যে যোগাযোগের মাধ্যমে সম্পন্ন হয়, এবং অন্য কয়েকটি উপায়ে প্রভাবিত হতে পারে।

Modifier.consumeWindowInsets(insets: WindowInsets) এছাড়াও Modifier.windowInsetsPadding এর মতো একইভাবে ইনসেটগুলি ব্যবহার করে, কিন্তু এটি প্যাডিং হিসাবে ব্যবহৃত ইনসেটগুলিকে প্রয়োগ করে না। এটি ইনসেট আকারের সংশোধকগুলির সাথে একত্রে কার্যকর, ভাইবোনদের বোঝাতে যে একটি নির্দিষ্ট পরিমাণ ইনসেট ইতিমধ্যেই ব্যবহার করা হয়েছে:

Column(Modifier.verticalScroll(rememberScrollState())) {
    Spacer(Modifier.windowInsetsTopHeight(WindowInsets.systemBars))

    Column(
        Modifier.consumeWindowInsets(
            WindowInsets.systemBars.only(WindowInsetsSides.Vertical)
        )
    ) {
        // content
        Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.ime))
    }

    Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.systemBars))
}

Modifier.consumeWindowInsets(paddingValues: PaddingValues) একটি WindowInsets আর্গুমেন্ট সহ সংস্করণের সাথে খুব অনুরূপ আচরণ করে, কিন্তু ব্যবহার করার জন্য একটি নির্বিচারে PaddingValues নেয়। এটি বাচ্চাদের জানানোর জন্য উপযোগী যখন প্যাডিং বা স্পেসিং ইনসেট প্যাডিং মডিফায়ারের পরিবর্তে অন্য কোনও প্রক্রিয়া দ্বারা প্রদান করা হয়, যেমন একটি সাধারণ Modifier.padding বা নির্দিষ্ট উচ্চতা স্পেসার:

Column(Modifier.padding(16.dp).consumeWindowInsets(PaddingValues(16.dp))) {
    // content
    Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.ime))
}

যে ক্ষেত্রে কাঁচা উইন্ডো ইনসেটগুলি খরচ ছাড়াই প্রয়োজন হয়, সেক্ষেত্রে সরাসরি WindowInsets মানগুলি ব্যবহার করুন, অথবা WindowInsets.asPaddingValues() ব্যবহার করে ইনসেটগুলির একটি PaddingValues ফেরত দিতে হবে যা ব্যবহার দ্বারা প্রভাবিত হয় না৷ যাইহোক, নীচের সতর্কতার কারণে, যেখানেই সম্ভব উইন্ডো ইনসেট প্যাডিং মডিফায়ার এবং উইন্ডো ইনসেট সাইজ মডিফায়ার ব্যবহার করতে পছন্দ করুন।

ইনসেট এবং জেটপ্যাক রচনা পর্যায়গুলি

কম্পোজ ইনসেটগুলিকে আপডেট এবং অ্যানিমেট করার জন্য অন্তর্নিহিত AndroidX কোর APIগুলি ব্যবহার করে, যা অন্তর্নিহিত প্ল্যাটফর্ম APIগুলি ইনসেটগুলি পরিচালনা করে। সেই প্ল্যাটফর্মের আচরণের কারণে, জেটপ্যাক কম্পোজের পর্যায়গুলির সাথে ইনসেটগুলির একটি বিশেষ সম্পর্ক রয়েছে।

ইনসেটগুলির মান কম্পোজিশন পর্বের পরে আপডেট করা হয়, কিন্তু লেআউট পর্বের আগে । এর মানে হল যে কম্পোজিশনে ইনসেটগুলির মান পড়া সাধারণত ইনসেটগুলির একটি মান ব্যবহার করে যা এক ফ্রেম দেরিতে হয়। এই পৃষ্ঠায় বর্ণিত অন্তর্নির্মিত সংশোধকগুলি বিন্যাস পর্ব পর্যন্ত ইনসেটগুলির মানগুলি ব্যবহার করে বিলম্ব করার জন্য তৈরি করা হয়েছে, যা নিশ্চিত করে যে ইনসেট মানগুলি আপডেট করা হয়েছে একই ফ্রেমে ব্যবহার করা হয়েছে৷