Android प्लैटफ़ॉर्म, सिस्टम यूज़र इंटरफ़ेस (यूआई) बनाने के लिए ज़िम्मेदार होता है, जैसे कि स्टेटस बार और नेविगेशन बार पर क्लिक करें. यह सिस्टम यूज़र इंटरफ़ेस (यूआई) दिखाया जाता है, भले ही वह किसी भी वह ऐप्लिकेशन है जिसका इस्तेमाल उपयोगकर्ता कर रहा है.
WindowInsets
, सिस्टम के बारे में जानकारी देता है
यूज़र इंटरफ़ेस (यूआई) की इमेज, ताकि यह पक्का किया जा सके कि आपका ऐप्लिकेशन सही जगह पर दिखे और यूज़र इंटरफ़ेस (यूआई) छिपी न हो
को लागू किया जा सकता है.
![सिस्टम बार के पीछे एक किनारे से दूसरे किनारे तक जाना](https://developer.android.com/static/develop/ui/compose/images/layouts/insets/e2e-intro.gif?authuser=9&hl=hi)
Android 14 (एपीआई लेवल 34) और इससे पहले के वर्शन पर, आपके ऐप्लिकेशन का यूज़र इंटरफ़ेस (यूआई) नीचे नहीं दिखता डिफ़ॉल्ट रूप से, सिस्टम बार और डिसप्ले कटआउट दिखेंगे.
Android 15 (एपीआई लेवल 35) और उसके बाद के वर्शन पर, आपका ऐप्लिकेशन सिस्टम के नीचे आता है बार और डिसप्ले कटआउट की सुविधा तब मिलती है, जब आपका ऐप्लिकेशन SDK टूल 35 को टारगेट कर लेता है. इसकी वजह से, उपयोगकर्ता अनुभव को बेहतर बनाता है. साथ ही, आपके ऐप्लिकेशन को तो उसे खाली छोड़ा जा सकता है.
सिस्टम यूज़र इंटरफ़ेस (यूआई) के पीछे कॉन्टेंट दिखाने को going Edge-to- Edge कहा जाता है. इस पर इस पेज पर आपको अलग-अलग तरह के इनसेट के बारे में जानकारी मिलती है, और एक से दूसरे पेज पर जाने का तरीका बताया गया है. साथ ही, अपने यूज़र इंटरफ़ेस (यूआई) को ऐनिमेट करने और अपने ऐप्लिकेशन का कॉन्टेंट पक्का करने के लिए, इनसेट एपीआई का इस्तेमाल कैसे करें सिस्टम के यूज़र इंटरफ़ेस (यूआई) एलिमेंट से छिप नहीं सकता.
इनसेट की बुनियादी बातें
जब कोई ऐप्लिकेशन एक से दूसरे किनारे तक जाता है, तो आपको यह पक्का करना होगा कि ज़रूरी कॉन्टेंट और सिस्टम के यूज़र इंटरफ़ेस (यूआई) से इंटरैक्शन को छिपाया नहीं जाता. उदाहरण के लिए, यदि कोई बटन जगह है, तो हो सकता है उपयोगकर्ता उस पर क्लिक न कर पाए.
सिस्टम के यूज़र इंटरफ़ेस (यूआई) का साइज़ और उसे कहां रखा जाएगा, इसकी जानकारी दी गई है insets के ज़रिए मिलेंगे.
सिस्टम के यूज़र इंटरफ़ेस (यूआई) के हर हिस्से में इसी तरह का इनसेट होता है, जो इसका साइज़ और उसे कहां रखा जाए. उदाहरण के लिए, स्टेटस बार इनसेट से आपको स्थिति बार और उसकी पोज़िशन बताई जाती है, जबकि नेविगेशन बार इनसेट से नेविगेशन बार का साइज़ और पोज़िशन. हर तरह के इनसेट में चार पिक्सल डाइमेंशन: ऊपर, बाएं, दाएं, और नीचे. इन डाइमेंशन से पता चलता है कि सिस्टम का यूज़र इंटरफ़ेस (यूआई), ऐप्लिकेशन की विंडो के संगत साइड से बड़ा हो जाता है. इससे बचने के लिए सिस्टम यूज़र इंटरफ़ेस (यूआई) को ओवरलैप करता है. इसलिए, ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) को उसी रकम.
पहले से मौजूद इन Android इनसेट के टाइप, WindowInsets
के ज़रिए उपलब्ध हैं:
स्टेटस बार की जानकारी देने वाले इनसेट. ये सिस्टम के सबसे ऊपर मौजूद यूज़र इंटरफ़ेस (यूआई) बार हैं. इनमें सूचना आइकॉन और दूसरे इंडिकेटर शामिल होते हैं. |
|
स्टेटस बार यह दिखाता है कि वे कब दिख रहे हैं. अगर स्टेटस बार फ़िलहाल छिपे हुए हैं (इमर्सिव फ़ुल स्क्रीन मोड में जाने की वजह से), तो मुख्य स्टेटस बार के इनसेट खाली होंगे, लेकिन ये इनसेट खाली नहीं होंगे. |
|
नेविगेशन बार की जानकारी देने वाले इनसेट. ये डिवाइस के बाईं, दाईं या नीचे की ओर सिस्टम यूज़र इंटरफ़ेस (यूआई) बार होते हैं, जो टास्कबार या नेविगेशन आइकॉन के बारे में बताते हैं. उपयोगकर्ता के पसंदीदा नेविगेशन के तरीके और टास्कबार के साथ इंटरैक्ट करने के दौरान, रनटाइम के दौरान इनमें बदलाव हो सकता है. |
|
नेविगेशन बार यह दिखाता है कि वे कब दिख रहे हैं. अगर नेविगेशन बार फ़िलहाल छिपे हुए हैं (मज़ेदार फ़ुल स्क्रीन मोड में जाने की वजह से), तो मुख्य नेविगेशन बार के इनसेट खाली होंगे, लेकिन ये इनसेट खाली नहीं होंगे. |
|
सिस्टम यूज़र इंटरफ़ेस (यूआई) विंडो की सजावट के बारे में बताने वाला इनसेट. अगर यह फ़्रीफ़ॉर्म विंडो में है, जैसे कि सबसे ऊपर मौजूद टाइटल बार. |
|
कैप्शन बार तब दिखाया जाता है, जब वे दिखाई देते हैं. अगर कैप्शन बार फ़िलहाल छिपाए गए हैं, तो मुख्य कैप्शन बार इनसेट खाली होंगे, लेकिन ये इनसेट खाली नहीं होंगे. |
|
यह सिस्टम बार इनसेट को जोड़ता है, जिनमें स्टेटस बार, नेविगेशन बार, और कैप्शन बार शामिल होते हैं. |
|
सिस्टम बार इनके दिखने की तारीख को सेट करता है. अगर इमर्सिव फ़ुल स्क्रीन मोड में जाने की वजह से फ़िलहाल सिस्टम बार छिपे हुए हैं, तो मुख्य सिस्टम बार इनसेट खाली होंगे, लेकिन ये इनसेट खाली नहीं होंगे. |
|
नीचे दिए गए इनसेट में, सॉफ़्टवेयर कीबोर्ड के नीचे इस्तेमाल की जा रही जगह के बारे में बताया गया है. |
|
इनसेट से यह पता चलता है कि कीबोर्ड के मौजूदा ऐनिमेशन से पहले सॉफ़्टवेयर कीबोर्ड ने कितनी जगह का इस्तेमाल किया था. |
|
इनसेट से यह पता चलता है कि कीबोर्ड के मौजूदा ऐनिमेशन के बाद, सॉफ़्टवेयर कीबोर्ड कितना स्पेस लेगा. |
|
एक तरह का इनसेट, जो नेविगेशन यूज़र इंटरफ़ेस (यूआई) के बारे में ज़्यादा जानकारी देता है. इससे "टैप" करने पर खाली जगह मिलती है उसे सिस्टम मैनेज करेगा, न कि ऐप्लिकेशन. जेस्चर वाले नेविगेशन वाले पारदर्शी नेविगेशन बार के लिए, ऐप्लिकेशन के कुछ एलिमेंट को सिस्टम नेविगेशन यूज़र इंटरफ़ेस (यूआई) से टैप किया जा सकता है. |
|
टैप किए जा सकने वाले एलिमेंट इस बात को सेट करते हैं कि वे कब दिख रहे हैं. अगर टैप किए जा सकने वाले एलिमेंट फ़िलहाल छिपाए गए हैं (इमर्सिव फ़ुल स्क्रीन मोड में जाने की वजह से), तो टैप किए जा सकने वाले मुख्य एलिमेंट इनसेट खाली होंगे, लेकिन ये इनसेट खाली नहीं होंगे. |
|
इनसेट में इनसेट की संख्या है, जहां सिस्टम नेविगेशन के लिए जेस्चर का इस्तेमाल करेगा. ऐप्लिकेशन |
|
यह सिस्टम जेस्चर का एक सबसेट है, जिसे सिस्टम हमेशा इस्तेमाल करेगा. साथ ही, जिसे |
|
इनसेट में, डिसप्ले कटआउट (नॉच या पिनहोल) को ओवरलैप होने से बचाने के लिए, ज़रूरी स्पेस की जानकारी दी गई है. |
|
झरने के घुमावदार हिस्सों को दिखाने वाले इनसेट. वॉटरफ़ॉल डिसप्ले में स्क्रीन के किनारों पर ऐसे घुमावदार इलाके होते हैं जहां स्क्रीन, डिवाइस के किनारों के साथ रैप होती है. |
इन टाइप की खास जानकारी में, तीन "सुरक्षित" शामिल हैं. इनसेट टाइप से यह पक्का किया जा सकता है कि अस्पष्ट:
ये "सुरक्षित" इनसेट टाइप में दिए गए प्लैटफ़ॉर्म इनसेट:
WindowInsets.safeDrawing
का इस्तेमाल करके, वह कॉन्टेंट सुरक्षित रखें जिसे नहीं बनाया जा सकता पर क्लिक करें. आम तौर पर, इनसेट का इस्तेमाल किया जाता है: ऐसा कॉन्टेंट बनाना जो सिस्टम के यूज़र इंटरफ़ेस (यूआई) से साफ़ न हो (या तो कुछ हद तक या शामिल हैं).- हाथ के जेस्चर से कॉन्टेंट को सुरक्षित रखने के लिए,
WindowInsets.safeGestures
का इस्तेमाल करें. यह ऐप जेस्चर के साथ सिस्टम जेस्चर के बीच टकराव से बचा जाता है (जैसे कि बॉटम जेस्चर शीट, कैरसेल या गेम में से कोई एक). WindowInsets.safeContent
का इस्तेमाल इनको मिलाकर करें पक्का करने के लिए,WindowInsets.safeDrawing
औरWindowInsets.safeGestures
कॉन्टेंट में कोई विज़ुअल ओवरलैप और जेस्चर ओवरलैप न हो.
इनसेट सेटअप
अपने ऐप्लिकेशन को उन जगहों पर पूरा कंट्रोल देने की अनुमति देने के लिए जहां वह कॉन्टेंट खींच सकता है, ये सेटअप करें चरण पूरे करें. इन चरणों के बिना, आपका ऐप्लिकेशन का इस्तेमाल किया जा सकता है या सॉफ़्टवेयर कीबोर्ड के साथ सिंक्रोनस रूप से ऐनिमेट नहीं किया जाता है.
- Android 15 और इसके बाद के वर्शन वाले डिवाइसों पर, SDK टूल के वर्शन 35 या इसके बाद वाले वर्शन को टारगेट करें. इससे, Android 15 और इसके बाद के वर्शन वाले डिवाइसों पर, डिवाइसों को अलग-अलग उपयोगकर्ताओं को एज-टू-एज पर सेट करने में मदद मिलेगी. आपका ऐप्लिकेशन सिस्टम यूज़र इंटरफ़ेस (यूआई) के पीछे दिखता है. आप हैंडल करके अपने ऐप्लिकेशन का यूज़र इंटरफ़ेस (यूआई) बदल सकते हैं इनसेट.
- वैकल्पिक रूप से,
enableEdgeToEdge()
को इतने समय बाद कॉल करेंActivity.onCreate()
, इसकी मदद से आपका ऐप्लिकेशन Android वर्शन. android:windowSoftInputMode="adjustResize"
को अपनी ऐक्टिविटी में सेट करेंAndroidManifest.xml
एंट्री. इस सेटिंग से, आपके ऐप्लिकेशन को साइज़ सॉफ़्टवेयर IME को इनसेट के रूप में उपयोग किया, जिसका उपयोग आप सामग्री को पैड करने और लेआउट करने के लिए कर सकते हैं आपके ऐप्लिकेशन में IME के दिखने और गायब होने पर, सही तरीके से.<!-- in your AndroidManifest.xml file: --> <activity android:name=".ui.MainActivity" android:label="@string/app_name" android:windowSoftInputMode="adjustResize" android:theme="@style/Theme.MyApplication" android:exported="true">
Compose के एपीआई
जब आपकी ऐक्टिविटी सभी इनसेट को मैनेज कर लेगी, तब आप कंपोज़ की सुविधा का इस्तेमाल कर सकते हैं एपीआई यह पक्का करते हैं कि कॉन्टेंट धुंधला न हो और इंटरैक्ट करने वाले एलिमेंट आपके को सिस्टम के यूज़र इंटरफ़ेस (यूआई) से ओवरलैप करें. ये एपीआई आपके ऐप्लिकेशन का लेआउट भी सिंक करते हैं इनसेट में बदलें.
उदाहरण के लिए, यह कॉन्टेंट पर इनसेट लागू करने का सबसे बुनियादी तरीका है पासवर्ड का इस्तेमाल करें:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { Box(Modifier.safeDrawingPadding()) { // the rest of the app } } }
यह स्निपेट safeDrawing
विंडो इनसेट को
कॉन्टेंट हटाने के लिए कहें. इससे यह पक्का होता है कि इंटरैक्ट करने वाले एलिमेंट आपके
सिस्टम के यूज़र इंटरफ़ेस (यूआई) से ओवरलैप करता है, तो इसका यह भी मतलब है कि कोई भी ऐप्लिकेशन
सिस्टम यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करें. पूरे डेटा का इस्तेमाल
विंडो के लिए, आपको एक स्क्रीन-दर-स्क्रीन पर इनसेट को लागू किए जाने वाले हिस्से को बेहतर बनाना होगा
या कॉम्पोनेंट-दर-कॉम्पोनेंट के आधार पर तय होता है.
ये सभी इनसेट टाइप, IME ऐनिमेशन के साथ अपने-आप ऐनिमेट होते हैं एपीआई 21 पर बैकपोर्ट किया गया. एक्सटेंशन का इस्तेमाल करके, इन इनसेट का इस्तेमाल करने वाले आपके सभी लेआउट साथ ही, इनसेट वैल्यू बदलने पर अपने-आप ऐनिमेट होता है.
कंपोज़ेबल को अडजस्ट करने के लिए, इन इनसेट टाइप का इस्तेमाल करने के दो मुख्य तरीके हैं लेआउट: पैडिंग मॉडिफ़ायर और इनसेट साइज़ मॉडिफ़ायर.
पैडिंग मॉडिफ़ायर
Modifier.windowInsetsPadding(windowInsets: WindowInsets)
ये शर्तें लागू करता है:
दिया गया विंडो इनसेट, पैडिंग के रूप में होता है, जो Modifier.padding
की तरह काम करता है.
उदाहरण के लिए, Modifier.windowInsetsPadding(WindowInsets.safeDrawing)
लागू होता है
सुरक्षित ड्रॉइंग इनसेट को चारों ओर पैडिंग के रूप में सेट कर देता है.
सबसे आम इनसेट टाइप के लिए, कई सुविधाएं पहले से मौजूद हैं.
Modifier.safeDrawingPadding()
ऐसा ही एक तरीका है.
Modifier.windowInsetsPadding(WindowInsets.safeDrawing)
. एनालॉग
दूसरे इनसेट टाइप के लिए मॉडिफ़ायर का इस्तेमाल करें.
इनसेट साइज़ मॉडिफ़ायर
नीचे दिए गए मॉडिफ़ायर, विंडो इनसेट की संख्या को कॉम्पोनेंट, इनसेट का साइज़ होना चाहिए:
windowInsets के शुरुआती हिस्से पर, चौड़ाई के तौर पर लागू करता है (जैसे कि |
|
windowInsets के आखिरी हिस्से को चौड़ाई के तौर पर लागू करता है (जैसे कि |
|
windowInsets के ऊपरी हिस्से को ऊंचाई के तौर पर लागू करता है (जैसे कि |
|
|
विंडो इनसेट के निचले हिस्से को ऊंचाई के तौर पर लागू करता है (जैसे |
ये मॉडिफ़ायर खास तौर पर, उस Spacer
का साइज़ बदलने के लिए काम के होते हैं जो
इनसेट का स्पेस:
LazyColumn( Modifier.imePadding() ) { // Other content item { Spacer( Modifier.windowInsetsBottomHeight( WindowInsets.systemBars ) ) } }
इनसेट इस्तेमाल
इनसेट पैडिंग मॉडिफ़ायर (windowInsetsPadding
और हेल्पर जैसे
safeDrawingPadding
) अपने-आप ही इनसेट के उस हिस्से का इस्तेमाल करती है जिसे
इसे पैडिंग के तौर पर लागू किया जाता है. कंपोज़िशन ट्री के अंदर जाते समय, नेस्ट किए हुए इनसेट को
पैडिंग मॉडिफ़ायर और इनसेट साइज़ मॉडिफ़ायर को पता है कि
इनसेट का इस्तेमाल बाहरी इनसेट पैडिंग मॉडिफ़ायर पहले ही कर लिया गया है. साथ ही,
इनसेट के एक ही हिस्से का एक से ज़्यादा बार इस्तेमाल करने से नतीजे में भी
ज़्यादा स्टोरेज की ज़रूरत नहीं होती.
इनसेट साइज़ मॉडिफ़ायर से भी इनसेट के एक ही हिस्से का इस्तेमाल एक से ज़्यादा बार नहीं किया जाता अगर इनसेट का पहले ही इस्तेमाल किया जा चुका है. हालांकि, जब से वह अपने का इस्तेमाल करते हैं, तो वे इनसेट का इस्तेमाल नहीं करते.
इस वजह से, नेस्टिंग पैडिंग मॉडिफ़ायर अपने-आप हर कंपोज़ेबल में पैडिंग (जगह) लागू की गई है.
पहले की तरह ही LazyColumn
उदाहरण पर नज़र डालें, LazyColumn
imePadding
मॉडिफ़ायर से साइज़ बदला जा सकता है. 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 बंद होने पर, बदलाव उलटे होते हैं: Spacer
जब imePadding()
इसके मान से कम लागू हो रहा हो, तो शून्य की ऊंचाई से बड़ा करें
सिस्टम बार के निचले हिस्से में दिखाई देता है, जब तक कि Spacer
की ऊंचाई के बराबर या उससे ज़्यादा नहीं हो जाती
IME के पूरी तरह से ऐनिमेट हो जाने के बाद, सिस्टम बार के नीचे की ओर.
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
या तय ऊंचाई
स्पेसर:
@OptIn(ExperimentalLayoutApi::class) Column(Modifier.padding(16.dp).consumeWindowInsets(PaddingValues(16.dp))) { // content Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.ime)) }
ऐसे मामलों में जहां बिना इस्तेमाल किए रॉ विंडो इनसेट की ज़रूरत हो, वहां
सीधे तौर पर WindowInsets
वैल्यू दें या WindowInsets.asPaddingValues()
का इस्तेमाल करके
ऐसे इनसेट का PaddingValues
मानें जो उपभोग से प्रभावित नहीं हैं.
हालांकि, नीचे दी गई चेतावनियों की वजह से, विंडो इनसेट पैडिंग का इस्तेमाल करें
जहां भी मुमकिन हो, वहां कार्रवाई बदलने वाली कुंजी और विंडो, साइज़ मॉडिफ़ायर को सेट कर देती है.
Insets और Jetpack Compose के चरण
Compose, इनसेट को अपडेट और ऐनिमेट करने के लिए, AndroidX के कोर एपीआई का इस्तेमाल करता है, जो इनसेट को मैनेज करने के लिए, दिए गए प्लैटफ़ॉर्म एपीआई का इस्तेमाल करते हैं. उस प्लैटफ़ॉर्म की वजह से व्यवहार, इनसेट का Jetpack के चरणों के साथ खास संबंध है लिखें.
इनसेट की वैल्यू, कंपोज़िशन फ़ेज़ के बाद अपडेट की जाती है, लेकिन शुरुआती वैल्यू से पहले अपडेट की जाती है लेआउट फ़ेज़. इसका मतलब है कि कंपोज़िशन में इनसेट की वैल्यू को पढ़ना आम तौर पर, इनसेट की ऐसी वैल्यू का इस्तेमाल करता है जो एक फ़्रेम देर से अपडेट होती है. बिल्ट-इन इस पेज पर बताए गए मॉडिफ़ायर में, लेआउट फ़ेज़ तक इनसेट करता है, जिससे यह पक्का होता है कि इनसेट वैल्यू का इस्तेमाल उसी फ़्रेम से जुड़ी हों जिसे उन्हें अपडेट किया गया है.
WindowInsets
के साथ कीबोर्ड IME ऐनिमेशन
किसी स्क्रोलिंग कंटेनर पर Modifier.imeNestedScroll()
को लागू करके, इसे खोला जा सकता है और
कंटेनर के नीचे तक स्क्रोल करते समय, IME को अपने-आप बंद कर देता है.
class WindowInsetsExampleActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) WindowCompat.setDecorFitsSystemWindows(window, false) setContent { MaterialTheme { MyScreen() } } } } @OptIn(ExperimentalLayoutApi::class) @Composable fun MyScreen() { Box { LazyColumn( modifier = Modifier .fillMaxSize() // fill the entire window .imePadding() // padding for the bottom for the IME .imeNestedScroll(), // scroll IME at the bottom content = { } ) FloatingActionButton( modifier = Modifier .align(Alignment.BottomEnd) .padding(16.dp) // normal 16dp of padding for FABs .navigationBarsPadding() // padding for navigation bar .imePadding(), // padding for when IME appears onClick = { } ) { Icon(imageVector = Icons.Filled.Add, contentDescription = "Add") } } }
![ऐनिमेशन में, यूआई एलिमेंट को ऊपर और नीचे की ओर स्क्रोल करते हुए कीबोर्ड का इस्तेमाल करते हुए दिखाया गया है](https://developer.android.com/static/develop/ui/compose/images/interop-keyboard.gif?authuser=9&hl=hi)
Material 3 कॉम्पोनेंट के लिए इनसेट सपोर्ट
आसानी से इस्तेमाल करने के लिए, पहले से मौजूद कई मटीरियल 3 कंपोज़ेबल
(androidx.compose.material3
)
यह इस बात के हिसाब से खुद इनसेट को हैंडल करता है कि आपके ऐप्लिकेशन में कंपोज़ेबल को किस तरह रखा गया है
सामग्री विनिर्देशों के अनुसार
इनसेट हैंडलिंग कंपोज़ेबल
नीचे मटीरियल की सूची दी गई है ऐसे कॉम्पोनेंट जो अपने-आप इनसेट को हैंडल करता है.
ऐप्लिकेशन बार
TopAppBar
/SmallTopAppBar
/CenterAlignedTopAppBar
/MediumTopAppBar
/LargeTopAppBar
: सिस्टम बार के टॉप और हॉरिज़ॉन्टल किनारों को पैडिंग के तौर पर लागू करता है, क्योंकि इसका इस्तेमाल विंडो के सबसे ऊपर किया जाता है.BottomAppBar
: सिस्टम बार के नीचे और हॉरिज़ॉन्टल साइड को पैडिंग के तौर पर लागू करता है.
कॉन्टेंट कंटेनर
ModalDrawerSheet
/DismissibleDrawerSheet
/PermanentDrawerSheet
(मॉडल नेविगेशन पैनल में मौजूद कॉन्टेंट): कॉन्टेंट पर वर्टिकल और स्टार्ट इनसेट लागू होते हैं.ModalBottomSheet
: सबसे नीचे इनसेट पर लागू होता है.NavigationBar
: नीचे और हॉरिज़ॉन्टल इनसेट पर लागू होता है.NavigationRail
: वर्टिकल और स्टार्ट इनसेट पर लागू होता है.
स्कैफ़ोल्ड
डिफ़ॉल्ट रूप से,
Scaffold
आपके इस्तेमाल और इस्तेमाल के लिए, पैरामीटर paddingValues
के रूप में इनसेट देता है.
Scaffold
, कॉन्टेंट पर इनसेट लागू नहीं करता; तो यह ज़िम्मेदारी आपकी है.
उदाहरण के लिए, Scaffold
के अंदर LazyColumn
के साथ इन इनसेट का इस्तेमाल करने के लिए:
Scaffold { innerPadding -> // innerPadding contains inset information for you to use and apply LazyColumn( // consume insets as scaffold doesn't do it by default modifier = Modifier.consumeWindowInsets(innerPadding), contentPadding = innerPadding ) { items(count = 100) { Box( Modifier .fillMaxWidth() .height(50.dp) .background(colors[it % colors.size]) ) } } }
डिफ़ॉल्ट इनसेट को बदलें
कंपोज़ेबल को पास किए गए windowInsets
पैरामीटर को, इस तरह बदला जा सकता है:
कंपोज़ेबल के व्यवहार को कॉन्फ़िगर करें. यह पैरामीटर अलग तरह का हो सकता है
इसके बजाय लागू करने के लिए विंडो इनसेट का इस्तेमाल करें, या कोई खाली इंस्टेंस पास करके बंद कर दें:
WindowInsets(0, 0, 0, 0)
.
उदाहरण के लिए, इनसेट हैंडलिंग को बंद करना
LargeTopAppBar
windowInsets
पैरामीटर को किसी खाली इंस्टेंस पर सेट करें:
LargeTopAppBar( windowInsets = WindowInsets(0, 0, 0, 0), title = { Text("Hi") } )
व्यू सिस्टम इनसेट के साथ इंटरऑप करें
अगर आपकी स्क्रीन में व्यू और कोड को उसी क्रम में लिखें. इस मामले में, आपको साफ़ तौर पर किसे इनसेट का इस्तेमाल करना चाहिए और किसे अनदेखा करना चाहिए.
उदाहरण के लिए, अगर आपका सबसे बाहरी लेआउट एक Android View लेआउट है, तो आपको
व्यू सिस्टम में इनसेट का इस्तेमाल करेगा और कंपोज़ के लिए उन्हें अनदेखा कर देगा.
इसके अलावा, अगर आपका सबसे बाहरी लेआउट एक कंपोज़ेबल है, तो आपको
लिखें और AndroidView
कंपोज़ेबल को ज़रूरत के हिसाब से पैड करें.
डिफ़ॉल्ट रूप से, हर ComposeView
खपत का WindowInsetsCompat
लेवल. इस डिफ़ॉल्ट तरीके को बदलने के लिए, इसे सेट करें
ComposeView.consumeWindowInsets
false
तक.
संसाधन
- अब Android पर — यह पूरी तरह से काम करने वाला Android ऐप्लिकेशन है. इसे पूरी तरह से Kotlin और Jetpack Compose के साथ बनाया गया है.
- Android 15 में, नीति उल्लंघन ठीक करने के तरीके (एनफ़ोर्समेंट) मैनेज करना — यह एक कोडलैब है, जो Android 15 वर्शन में, हर नए वर्शन पर लागू होने वाले बदलावों के हिसाब से काम करता है
- Android ऐप्लिकेशन के अनुभव को बेहतर बनाने के लिए तीन चीज़ें: एज टू एज, अनुमानित बैक, और एक नज़र में जानकारी — यह YouTube वीडियो है, जिसमें Android 15 को हर उपयोगकर्ता के हिसाब से लागू करने के तरीके के बारे में बताया गया है
- एज-टू-एज और इनसेट | लिखने से जुड़ी सलाह — एक YouTube वीडियो, जिसमें इनसेट को इस्तेमाल करने का तरीका बताया गया है
आपके लिए सुझाव
- ध्यान दें: JavaScript बंद होने पर लिंक टेक्स्ट दिखता है
- मटीरियल कॉम्पोनेंट और लेआउट
CoordinatorLayout
को Compose में माइग्रेट करें- ध्यान देने वाली अन्य बातें