إدراجات النوافذ في "إنشاء"

يكون نظام Android الأساسي مسؤولًا عن رسم واجهة مستخدم النظام، مثل شريط الحالة وشريط التنقل. يتم عرض واجهة مستخدم النظام هذه بغض النظر عن التطبيق الذي يستخدمه المستخدم. توفِّر WindowInsets معلومات حول واجهة مستخدم النظام لضمان أنّ تطبيقك يرسم في المنطقة الصحيحة وأنّ واجهة مستخدم النظام لا تحجبها.

تقديم محتوى شامل للرسم خلف أشرطة النظام
الشكل 1. الاستفادة من جميع الجوانب للرسم خلف أشرطة النظام

تقتصر واجهة مستخدم التطبيق تلقائيًا على الظهور في واجهة مستخدم النظام، مثل شريط الحالة وشريط التنقل. يضمن ذلك عدم حجب محتوى تطبيقك بواسطة عناصر واجهة مستخدم النظام.

ومع ذلك، ننصح التطبيقات بتفعيل العرض في هذه المناطق التي يتم فيها عرض واجهة مستخدم النظام أيضًا، ما يؤدي إلى تجربة مستخدم أكثر سلاسة ويسمح للتطبيق بالاستفادة الكاملة من مساحة النوافذ المتاحة له. يتيح ذلك أيضًا للتطبيقات إضافة تأثيرات حركية إلى واجهة مستخدم النظام، لا سيّما عند إظهار لوحة المفاتيح البرمجية وإخفائها.

إنّ الموافقة على عرض المحتوى في هذه المناطق وعرض المحتوى من خلال واجهة مستخدم النظام تسمى التطوير الشامل. في هذه الصفحة، تعرف على النوع المختلف من الأجزاء الداخلية، وكيفية الاشتراك في الانتقال من شمول إلى آخر، وكيفية استخدام واجهات برمجة التطبيقات الداخلية لتحريك واجهة المستخدم الخاصة بك وتجنب حجب أجزاء من تطبيقك.

أساسيات الإدراج

عندما ينتقل التطبيق من البداية إلى النهاية، تحتاج إلى التأكد من عدم حجب المحتوى والتفاعلات المهمة من خلال واجهة مستخدم النظام. على سبيل المثال، إذا تم وضع زر خلف شريط التنقل، فقد لا يتمكن المستخدم من النقر فوقه.

يتم تحديد حجم واجهة مستخدم النظام والمعلومات عن مكان وضعها من خلال المجموعات.

يحتوي كل جزء من واجهة مستخدم النظام على نوع مقابل من العناصر الداخلية يصف حجمه ومكان وضعه. على سبيل المثال، توفر المساحات الداخلية لشريط الحالة حجم شريط الحالة وموضعه، بينما توفر الأجزاء الداخلية لشريط التنقل حجم شريط التنقل وموضعه. يتكون كل نوع من العناصر الداخلية من أربعة أبعاد بكسل: أعلى ويسار ويمين وأسفل. تحدد هذه الأبعاد مدى امتداد واجهة مستخدم النظام عن الجوانب المقابلة لنافذة التطبيق. لتجنُّب التداخل مع هذا النوع من واجهة مستخدم النظام، لذلك، يجب ضبط واجهة مستخدم التطبيق بهذا المقدار.

تتوفّر أنواع الإدخالات المدمجة التالية في Android من خلال WindowInsets:

WindowInsets.statusBars

الإدخالات التي تصف أشرطة الحالة. هذه هي أهم أشرطة واجهة مستخدم النظام التي تحتوي على رموز إشعارات ومؤشرات أخرى.

WindowInsets.statusBarsIgnoringVisibility

يتم إدراج إدخالات شريط الحالة عندما تكون مرئية. إذا كانت أشرطة الحالة مخفية حاليًا (بسبب الدخول في وضع ملء الشاشة الغامر)، فستكون الأجزاء الداخلية لشريط الحالة الرئيسية فارغة، ولكن لن تكون هذه الأجزاء الداخلية غير فارغة.

WindowInsets.navigationBars

التفاصيل الداخلية التي تصف أشرطة التنقل. هذه هي أشرطة واجهة مستخدم النظام على الجانب الأيسر أو الأيمن أو السفلي من الجهاز، والتي تصف شريط التطبيقات أو رموز التنقل. ويمكن أن تتغيّر هذه الرموز في وقت التشغيل بناءً على طريقة التنقّل المفضّلة لدى المستخدم والتفاعل مع شريط التطبيقات.

WindowInsets.navigationBarsIgnoringVisibility

إدراجات شريط التنقل عندما تكون مرئية. إذا كانت أشرطة التنقل مخفية حاليًا (بسبب الدخول في وضع ملء الشاشة المجسَّم)، فستكون الأجزاء الداخلية لشريط التنقل الرئيسي فارغة، ولكن لن تكون هذه الأجزاء الداخلية غير فارغة.

WindowInsets.captionBar

المساحة الداخلية التي تصف زخرفة نافذة واجهة مستخدم النظام إذا كانت في نافذة حرة، مثل شريط العنوان العلوي.

WindowInsets.captionBarIgnoringVisibility

يتم إدراج شريط الترجمة والشرح عند ظهورها. إذا كانت أشرطة التسمية التوضيحية مخفية حاليًا، فستكون الأجزاء الداخلية لشريط التسمية التوضيحية الرئيسية فارغة، ولكن لن تكون هذه الأجزاء الداخلية غير فارغة.

WindowInsets.systemBars

اتحاد أجزاء شريط النظام، الذي يتضمن أشرطة الحالة وأشرطة التنقل وشريط الترجمة.

WindowInsets.systemBarsIgnoringVisibility

إدراجات شريط النظام عندما تكون مرئية. إذا كانت أشرطة النظام مخفية حاليًا (بسبب الدخول في وضع ملء الشاشة المجسَّم)، فستكون الأجزاء الداخلية لشريط النظام الرئيسية فارغة، ولكن لن تكون هذه الأجزاء الداخلية غير فارغة.

WindowInsets.ime

تصف المساحات الداخلية مقدار المساحة في الأسفل التي تشغلها لوحة المفاتيح البرمجية.

WindowInsets.imeAnimationSource

تصف المساحات الداخلية مقدار المساحة التي شغلتها لوحة المفاتيح البرمجية قبل الصورة المتحركة الحالية للوحة المفاتيح.

WindowInsets.imeAnimationTarget

تصف المساحات الداخلية مقدار المساحة التي ستشغلها لوحة المفاتيح البرمجية بعد الصورة المتحركة الحالية للوحة المفاتيح.

WindowInsets.tappableElement

نوع من الإضافات يصف معلومات أكثر تفصيلاً حول واجهة مستخدم التنقّل، ما يوفّر مقدار المساحة التي يعالج فيها النظام "النقرات" وليس التطبيق. بالنسبة إلى أشرطة التنقّل الشفافة مع التنقّل بالإيماءات، يمكن أن تكون بعض عناصر التطبيق قابلة للنقر من خلال واجهة مستخدم التنقّل في النظام.

WindowInsets.tappableElementIgnoringVisibility

يتم إدراج العناصر القابلة للنقر عندما تكون مرئية. إذا كانت العناصر القابلة للنقر مخفية في الوقت الحالي (بسبب الدخول في وضع ملء الشاشة المجسَّم)، ستكون الأجزاء داخل العناصر القابلة للنقر الرئيسية فارغة، ولكن لن تكون هذه الأجزاء الداخلية غير فارغة.

WindowInsets.systemGestures

تمثل المساحات الداخلية عدد الأجزاء الداخلية التي يعترض فيها النظام الإيماءات للتنقل. يمكن للتطبيقات تحديد كيفية التعامل مع عدد محدود من هذه الإيماءات يدويًا من خلال Modifier.systemGestureExclusion.

WindowInsets.mandatorySystemGestures

مجموعة فرعية من إيماءات النظام التي سيتعامل معها النظام دائمًا، ولا يمكن إيقافها من خلال Modifier.systemGestureExclusion.

WindowInsets.displayCutout

تمثّل المساحات الداخلية مقدار التباعد اللازم لتجنب التداخل مع قطع الشاشة (الثقب أو الثقب).

WindowInsets.waterfall

العناصر الداخلية التي تمثل المناطق المنحنية لعرض الشلال. تحتوي شاشة العرض الشلال على مناطق منحنية على طول حواف الشاشة حيث يبدأ التفاف الشاشة على جوانب الجهاز.

يتم تلخيص هذه الأنواع بثلاثة أنواع "آمنة" من الإدخالات التي تضمن عدم حجب المحتوى:

تحمي أنواع الإدخالات "الآمنة" هذه المحتوى بطرق مختلفة، استنادًا إلى العناصر الأساسية للنظام الأساسي:

  • يمكنك استخدام WindowInsets.safeDrawing لحماية المحتوى الذي يجب عدم رسمه أسفل أي واجهة مستخدم خاصة بالنظام. هذا هو الاستخدام الأكثر شيوعًا للمساحات الداخلية: لمنع رسم محتوى تحجبه واجهة مستخدم النظام (سواء جزئيًا أو كليًا).
  • استخدِم WindowInsets.safeGestures لحماية المحتوى باستخدام الإيماءات. وهذا يؤدي إلى تجنب تضارب إيماءات النظام مع إيماءات التطبيقات (مثل تلك الخاصة بأوراق البيانات السفلية أو لوحات العرض الدوّارة أو الألعاب).
  • يمكنك استخدام السمتَين WindowInsets.safeContent معًا من خلال السمتَين WindowInsets.safeDrawing وWindowInsets.safeGestures لضمان عدم تداخُل المحتوى مرئيًا وعدم تداخُل الإيماءات.

إعداد مجموعات البيانات الداخلية

للسماح لتطبيقك بالتحكم الكامل في المكان الذي يرسم فيه المحتوى، اتبع خطوات الإعداد التالية. وبدون هذه الخطوات، قد يرسم تطبيقك ألوانًا سوداء أو ثابتة خلف واجهة مستخدم النظام، أو قد لا يتحرك بشكل متزامن مع لوحة المفاتيح البرمجية.

  1. الاتصال بـ enableEdgeToEdge() في Activity.onCreate. يطلب هذا الاستدعاء أن يعرض تطبيقك خلف واجهة مستخدم النظام. سيتحكم تطبيقك بعد ذلك في كيفية استخدام هذه الأجزاء الداخلية لضبط واجهة المستخدم.
  2. يمكنك ضبط "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). هناك معدِّلات مماثلة لأنواع الإدخالات الأخرى.

عناصر تعديل حجم الإدخالات

تُطبق المعدِّلات التالية مقدارًا من المساحات الداخلية للنوافذ عن طريق تعيين حجم المكون ليكون حجم العناصر الداخلية:

Modifier.windowInsetsStartWidth(windowInsets: WindowInsets)

يُطبِّق جانب بداية windowInsets كعرض (مثل Modifier.width).

Modifier.windowInsetsEndWidth(windowInsets: WindowInsets)

يُطبق جانب نهاية windowInsets كعرض (مثل Modifier.width)

Modifier.windowInsetsTopHeight(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 نفسه كما في السابق، يتم تغيير حجم 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 بالكامل.

الشكل 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 العادية أو الفواصل ذات الارتفاع الثابت:

@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.

معالجة عناصر قابلة للإنشاء

وفيما يلي قائمة بمكونات المواد التي تتعامل تلقائيًا مع العناصر الداخلية.

أشرطة التطبيقات

حاويات المحتوى

  • 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.

المراجع