يكون نظام Android الأساسي مسؤولًا عن رسم واجهة مستخدم النظام، مثل شريط الحالة وشريط التنقل. يتم عرض واجهة مستخدم النظام هذه بغض النظر عن
التطبيق الذي يستخدمه المستخدم. توفِّر WindowInsets
معلومات حول واجهة مستخدم النظام لضمان أنّ تطبيقك يرسم في المنطقة الصحيحة وأنّ واجهة مستخدم النظام لا تحجبها.
تقتصر واجهة مستخدم التطبيق تلقائيًا على الظهور في واجهة مستخدم النظام، مثل شريط الحالة وشريط التنقل. يضمن ذلك عدم حجب محتوى تطبيقك بواسطة عناصر واجهة مستخدم النظام.
ومع ذلك، ننصح التطبيقات بتفعيل العرض في هذه المناطق التي يتم فيها عرض واجهة مستخدم النظام أيضًا، ما يؤدي إلى تجربة مستخدم أكثر سلاسة ويسمح للتطبيق بالاستفادة الكاملة من مساحة النوافذ المتاحة له. يتيح ذلك أيضًا للتطبيقات إضافة تأثيرات حركية إلى واجهة مستخدم النظام، لا سيّما عند إظهار لوحة المفاتيح البرمجية وإخفائها.
إنّ الموافقة على عرض المحتوى في هذه المناطق وعرض المحتوى من خلال واجهة مستخدم النظام تسمى التطوير الشامل. في هذه الصفحة، تعرف على النوع المختلف من الأجزاء الداخلية، وكيفية الاشتراك في الانتقال من شمول إلى آخر، وكيفية استخدام واجهات برمجة التطبيقات الداخلية لتحريك واجهة المستخدم الخاصة بك وتجنب حجب أجزاء من تطبيقك.
أساسيات الإدراج
عندما ينتقل التطبيق من البداية إلى النهاية، تحتاج إلى التأكد من عدم حجب المحتوى والتفاعلات المهمة من خلال واجهة مستخدم النظام. على سبيل المثال، إذا تم وضع زر خلف شريط التنقل، فقد لا يتمكن المستخدم من النقر فوقه.
يتم تحديد حجم واجهة مستخدم النظام والمعلومات عن مكان وضعها من خلال المجموعات.
يحتوي كل جزء من واجهة مستخدم النظام على نوع مقابل من العناصر الداخلية يصف حجمه ومكان وضعه. على سبيل المثال، توفر المساحات الداخلية لشريط الحالة حجم شريط الحالة وموضعه، بينما توفر الأجزاء الداخلية لشريط التنقل حجم شريط التنقل وموضعه. يتكون كل نوع من العناصر الداخلية من أربعة أبعاد بكسل: أعلى ويسار ويمين وأسفل. تحدد هذه الأبعاد مدى امتداد واجهة مستخدم النظام عن الجوانب المقابلة لنافذة التطبيق. لتجنُّب التداخل مع هذا النوع من واجهة مستخدم النظام، لذلك، يجب ضبط واجهة مستخدم التطبيق بهذا المقدار.
تتوفّر أنواع الإدخالات المدمجة التالية في Android من خلال WindowInsets
:
الإدخالات التي تصف أشرطة الحالة. هذه هي أهم أشرطة واجهة مستخدم النظام التي تحتوي على رموز إشعارات ومؤشرات أخرى. |
|
يتم إدراج إدخالات شريط الحالة عندما تكون مرئية. إذا كانت أشرطة الحالة مخفية حاليًا (بسبب الدخول في وضع ملء الشاشة الغامر)، فستكون الأجزاء الداخلية لشريط الحالة الرئيسية فارغة، ولكن لن تكون هذه الأجزاء الداخلية غير فارغة. |
|
التفاصيل الداخلية التي تصف أشرطة التنقل. هذه هي أشرطة واجهة مستخدم النظام على الجانب الأيسر أو الأيمن أو السفلي من الجهاز، والتي تصف شريط التطبيقات أو رموز التنقل. ويمكن أن تتغيّر هذه الرموز في وقت التشغيل بناءً على طريقة التنقّل المفضّلة لدى المستخدم والتفاعل مع شريط التطبيقات. |
|
إدراجات شريط التنقل عندما تكون مرئية. إذا كانت أشرطة التنقل مخفية حاليًا (بسبب الدخول في وضع ملء الشاشة المجسَّم)، فستكون الأجزاء الداخلية لشريط التنقل الرئيسي فارغة، ولكن لن تكون هذه الأجزاء الداخلية غير فارغة. |
|
المساحة الداخلية التي تصف زخرفة نافذة واجهة مستخدم النظام إذا كانت في نافذة حرة، مثل شريط العنوان العلوي. |
|
يتم إدراج شريط الترجمة والشرح عند ظهورها. إذا كانت أشرطة التسمية التوضيحية مخفية حاليًا، فستكون الأجزاء الداخلية لشريط التسمية التوضيحية الرئيسية فارغة، ولكن لن تكون هذه الأجزاء الداخلية غير فارغة. |
|
اتحاد أجزاء شريط النظام، الذي يتضمن أشرطة الحالة وأشرطة التنقل وشريط الترجمة. |
|
إدراجات شريط النظام عندما تكون مرئية. إذا كانت أشرطة النظام مخفية حاليًا (بسبب الدخول في وضع ملء الشاشة المجسَّم)، فستكون الأجزاء الداخلية لشريط النظام الرئيسية فارغة، ولكن لن تكون هذه الأجزاء الداخلية غير فارغة. |
|
تصف المساحات الداخلية مقدار المساحة في الأسفل التي تشغلها لوحة المفاتيح البرمجية. |
|
تصف المساحات الداخلية مقدار المساحة التي شغلتها لوحة المفاتيح البرمجية قبل الصورة المتحركة الحالية للوحة المفاتيح. |
|
تصف المساحات الداخلية مقدار المساحة التي ستشغلها لوحة المفاتيح البرمجية بعد الصورة المتحركة الحالية للوحة المفاتيح. |
|
نوع من الإضافات يصف معلومات أكثر تفصيلاً حول واجهة مستخدم التنقّل، ما يوفّر مقدار المساحة التي يعالج فيها النظام "النقرات" وليس التطبيق. بالنسبة إلى أشرطة التنقّل الشفافة مع التنقّل بالإيماءات، يمكن أن تكون بعض عناصر التطبيق قابلة للنقر من خلال واجهة مستخدم التنقّل في النظام. |
|
يتم إدراج العناصر القابلة للنقر عندما تكون مرئية. إذا كانت العناصر القابلة للنقر مخفية في الوقت الحالي (بسبب الدخول في وضع ملء الشاشة المجسَّم)، ستكون الأجزاء داخل العناصر القابلة للنقر الرئيسية فارغة، ولكن لن تكون هذه الأجزاء الداخلية غير فارغة. |
|
تمثل المساحات الداخلية عدد الأجزاء الداخلية التي يعترض فيها النظام الإيماءات للتنقل. يمكن للتطبيقات تحديد كيفية التعامل مع عدد محدود من هذه الإيماءات يدويًا من خلال |
|
مجموعة فرعية من إيماءات النظام التي سيتعامل معها النظام دائمًا، ولا يمكن إيقافها من خلال |
|
تمثّل المساحات الداخلية مقدار التباعد اللازم لتجنب التداخل مع قطع الشاشة (الثقب أو الثقب). |
|
العناصر الداخلية التي تمثل المناطق المنحنية لعرض الشلال. تحتوي شاشة العرض الشلال على مناطق منحنية على طول حواف الشاشة حيث يبدأ التفاف الشاشة على جوانب الجهاز. |
يتم تلخيص هذه الأنواع بثلاثة أنواع "آمنة" من الإدخالات التي تضمن عدم حجب المحتوى:
تحمي أنواع الإدخالات "الآمنة" هذه المحتوى بطرق مختلفة، استنادًا إلى العناصر الأساسية للنظام الأساسي:
- يمكنك استخدام
WindowInsets.safeDrawing
لحماية المحتوى الذي يجب عدم رسمه أسفل أي واجهة مستخدم خاصة بالنظام. هذا هو الاستخدام الأكثر شيوعًا للمساحات الداخلية: لمنع رسم محتوى تحجبه واجهة مستخدم النظام (سواء جزئيًا أو كليًا). - استخدِم
WindowInsets.safeGestures
لحماية المحتوى باستخدام الإيماءات. وهذا يؤدي إلى تجنب تضارب إيماءات النظام مع إيماءات التطبيقات (مثل تلك الخاصة بأوراق البيانات السفلية أو لوحات العرض الدوّارة أو الألعاب). - يمكنك استخدام السمتَين
WindowInsets.safeContent
معًا من خلال السمتَينWindowInsets.safeDrawing
وWindowInsets.safeGestures
لضمان عدم تداخُل المحتوى مرئيًا وعدم تداخُل الإيماءات.
إعداد مجموعات البيانات الداخلية
للسماح لتطبيقك بالتحكم الكامل في المكان الذي يرسم فيه المحتوى، اتبع خطوات الإعداد التالية. وبدون هذه الخطوات، قد يرسم تطبيقك ألوانًا سوداء أو ثابتة خلف واجهة مستخدم النظام، أو قد لا يتحرك بشكل متزامن مع لوحة المفاتيح البرمجية.
- الاتصال بـ
enableEdgeToEdge()
فيActivity.onCreate
. يطلب هذا الاستدعاء أن يعرض تطبيقك خلف واجهة مستخدم النظام. سيتحكم تطبيقك بعد ذلك في كيفية استخدام هذه الأجزاء الداخلية لضبط واجهة المستخدم. يمكنك ضبط "
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 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، ويبدأ
مفتاح تعديل imePadding()
في تطبيق المساحة المتروكة السفلية لتغيير حجم
LazyColumn
عند فتح أداة IME. عندما يبدأ معدِّل imePadding()
في تطبيق المساحة المتروكة السفلية، يبدأ أيضًا في استهلاك هذا المقدار من الأجزاء الداخلية. وبالتالي، يبدأ ارتفاع Spacer
في الانخفاض، عندما يطبّق مفتاح التعديل imePadding()
مسافة لأشرطة النظام. بعد تطبيق معدِّل
imePadding()
على مقدار من المساحة المتروكة السفلية
أكبر من أشرطة النظام، يصبح ارتفاع Spacer
صفرًا.
وعند إغلاق أداة IME، تحدث التغييرات بشكل عكسي: يبدأ Spacer
في التوسّع من ارتفاعه صفر بعد تطبيق imePadding()
أقل من الجانب السفلي لأشرطة النظام، إلى أن يتطابق Spacer
في النهاية مع ارتفاع الجانب السفلي من أشرطة النظام بعد تحريك أداة IME بالكامل.
يتم تحقيق ذلك من خلال التواصل بين جميع معدِّلات بيانات 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 Compose.
يتم تحديث قيمة الإضافات بعد مرحلة الإنشاء، ولكن قبل مرحلة التخطيط. وهذا يعني أن قراءة قيمة العناصر الداخلية في التركيبة تستخدم بشكل عام قيمة العناصر الداخلية التي تأخرت بإطار واحد. تم تصميم المعدّلات المضمنة الموضحة في هذه الصفحة لتأجيل استخدام قيم العمليات حتى مرحلة التخطيط، مما يضمن استخدام القيم الداخلية في نفس الإطار أثناء تحديثها.
صور IME المتحركة في لوحة المفاتيح باستخدام WindowInsets
يمكنك تطبيق 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") } } }
الشكل 1. الصور المتحركة في أداة IME
دعم داخلي لمكونات المادة 3
لتسهيل الاستخدام، تعالج العديد من المواد القابلة للإنشاء في Material 3
(androidx.compose.material3
)
المدمَجة الأجزاء الداخلية بنفسها بناءً على طريقة وضع العناصر القابلة للإنشاء في تطبيقك
وفقًا لمواصفات Material.
معالجة عناصر قابلة للإنشاء
وفيما يلي قائمة بمكونات المواد التي تتعامل تلقائيًا مع العناصر الداخلية.
أشرطة التطبيقات
TopAppBar
/SmallTopAppBar
/CenterAlignedTopAppBar
/MediumTopAppBar
/LargeTopAppBar
: يتيح هذا الخيار تطبيق الجانبَين العلوي والأفقي كمساحة متروكة لأنّه يتم استخدامهما في أعلى النافذة.BottomAppBar
: يتيح هذا الخيار تطبيق الجانبَين السفلي والأفقي من أشرطة النظام كمساحة متروكة.
حاويات المحتوى
ModalDrawerSheet
/DismissibleDrawerSheet
/PermanentDrawerSheet
(محتوى داخل لائحة تنقُّل مشروطة): يطبِّق هذا النوع من الإضافات وضع العمود والبدء على المحتوى.ModalBottomSheet
: يطبِّق الأجزاء الداخلية الأسفل.NavigationBar
: يتيح تطبيق الشكل الداخلي السفلي والأفقي.NavigationRail
: يطبِّق المكانَان الداخليَّين العمودي والبداية.
سقّالة
وبشكلٍ تلقائي، توفِّر Scaffold
مساحات داخلية كمَعلمة paddingValues
يمكنك استخدامها واستخدامها.
لا تُطبّق شركة "Scaffold
" الإضافات على المحتوى، وتقع على عاتقك مسؤولية ذلك.
على سبيل المثال، للاطّلاع على هذه الأجزاء الداخلية مع LazyColumn
داخل Scaffold
:
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، يجب استخدام العناصر الداخلية في نظام العرض وتجاهلها في Compose.
بدلاً من ذلك، إذا كان التنسيق الخارجي قابلاً للإنشاء، عليك استخدام
العناصر الداخلية في Compose، وملء العناصر AndroidView
القابلة للإنشاء وفقًا لذلك.
يستهلك كل ComposeView
تلقائيًا جميع الإدخالات على مستوى WindowInsetsCompat
من الاستهلاك. لتغيير هذا السلوك التلقائي، اضبط
ComposeView.consumeWindowInsets
على false
.
المراجع
- يتوفّر الآن في Android: تطبيق Android كامل الوظائف تم إنشاؤه بالكامل باستخدام Kotlin وJetpack Compose.
أفلام مُقترَحة لك
- ملاحظة: يتم عرض نص الرابط عند إيقاف JavaScript.
- تصاميم ومكوّنات Material
- نقل بيانات
CoordinatorLayout
إلى Compose - اعتبارات أخرى