ورودی های پنجره در Compose

پلتفرم اندروید وظیفه ترسیم رابط کاربری سیستم مانند نوار وضعیت و نوار ناوبری را بر عهده دارد. این رابط کاربری سیستم صرف نظر از اینکه کاربر از کدام برنامه استفاده می کند، نمایش داده می شود. WindowInsets اطلاعاتی در مورد رابط کاربری سیستم ارائه می دهد تا اطمینان حاصل کند که برنامه شما در ناحیه درست طراحی می شود و رابط کاربری شما توسط رابط کاربری سیستم مبهم نیست.

لبه به لبه بروید تا پشت میله های سیستم بکشید
شکل 1. رفتن لبه به لبه برای کشیدن پشت میله های سیستم

به‌طور پیش‌فرض، رابط کاربری برنامه شما محدود به قرار گرفتن در رابط کاربری سیستم است، مانند نوار وضعیت و نوار پیمایش. این تضمین می کند که محتوای برنامه شما توسط عناصر رابط کاربری سیستم مخفی نمی شود.

با این حال، ما به برنامه‌ها توصیه می‌کنیم در این قسمت‌ها که رابط کاربری سیستم نیز نمایش داده می‌شود، نمایش داده شوند، که منجر به تجربه کاربری یکپارچه‌تر می‌شود و به برنامه شما اجازه می‌دهد تا از فضای پنجره‌ای که در دسترس است استفاده کامل کند. این همچنین به برنامه‌ها اجازه می‌دهد تا همراه با رابط کاربری سیستم متحرک شوند، به‌خصوص هنگام نمایش و پنهان کردن صفحه‌کلید نرم‌افزار.

شرکت در نمایش در این مناطق و نمایش محتوا در پشت رابط کاربری سیستم ، لبه به لبه نامیده می شود. در این صفحه، در مورد انواع مختلف inset ها، نحوه شرکت در استفاده از لبه به لبه، و نحوه استفاده از API های داخلی برای متحرک سازی UI خود و جلوگیری از مبهم شدن بخش های برنامه خود، یاد می گیرید.

درج اصول

هنگامی که یک برنامه لبه به لبه می شود، باید اطمینان حاصل کنید که محتوا و تعاملات مهم توسط رابط کاربری سیستم مبهم نیست. به عنوان مثال، اگر دکمه ای در پشت نوار ناوبری قرار داده شود، ممکن است کاربر نتواند روی آن کلیک کند.

اندازه UI سیستم و اطلاعات مربوط به محل قرارگیری آن از طریق inset ها مشخص می شود.

هر بخش از UI سیستم دارای یک نوع ورودی متناظر است که اندازه و محل قرارگیری آن را توصیف می کند. به عنوان مثال، نوار وضعیت اندازه و موقعیت نوار وضعیت را ارائه می دهد، در حالی که نوارهای ناوبری اندازه و موقعیت نوار پیمایش را ارائه می دهند. هر نوع اینست از چهار بعد پیکسل تشکیل شده است: بالا، چپ، راست و پایین. این ابعاد مشخص می‌کند که رابط کاربری سیستم تا چه اندازه از طرف‌های مربوطه پنجره برنامه امتداد دارد. بنابراین، برای جلوگیری از همپوشانی با آن نوع رابط کاربری سیستم، رابط کاربری برنامه باید با آن مقدار درج شود.

این انواع داخلی اندروید از طریق 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 برای محافظت از محتوایی که نباید زیر هیچ رابط کاربری سیستمی کشیده شود، استفاده کنید. این رایج ترین استفاده از inset ها است: برای جلوگیری از ترسیم محتوایی که توسط رابط کاربری سیستم (چه به طور جزئی یا کامل) مبهم است.
  • از WindowInsets.safeGestures برای محافظت از محتوا با حرکات استفاده کنید. این کار از تداخل حرکات سیستم با حرکات برنامه (مانند موارد مربوط به صفحات پایین، چرخ فلک ها یا در بازی ها) جلوگیری می کند.
  • از WindowInsets.safeContent به عنوان ترکیبی از WindowInsets.safeDrawing و WindowInsets.safeGestures استفاده کنید تا مطمئن شوید محتوا همپوشانی بصری و همپوشانی حرکتی ندارد.

راه اندازی Insets

برای اینکه برنامه‌تان کنترل کاملی بر جایی که محتوا را می‌کشد کنترل کند، این مراحل راه‌اندازی را دنبال کنید. بدون این مراحل، برنامه شما ممکن است رنگ‌های سیاه یا یکدست را پشت رابط کاربری سیستم بکشد، یا به طور همزمان با صفحه‌کلید نرم‌افزار متحرک نشود.

  1. enableEdgeToEdge() را در Activity.onCreate فراخوانی کنید. این تماس درخواست می کند که برنامه شما در پشت رابط کاربری سیستم نمایش داده شود. سپس برنامه شما کنترل نحوه استفاده از آن درجات برای تنظیم رابط کاربری را در اختیار خواهد داشت.
  2. android:windowSoftInputMode="adjustResize" را در ورودی AndroidManifest.xml Activity خود تنظیم کنید. این تنظیم به برنامه شما اجازه می‌دهد تا اندازه نرم‌افزار 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">
    

API ها را بنویسید

هنگامی که Activity شما کنترل همه موارد داخلی را به دست گرفت، می توانید از Compose API استفاده کنید تا مطمئن شوید که محتوا مبهم نیست و عناصر قابل تعامل با رابط کاربری سیستم همپوشانی ندارند. این APIها همچنین چیدمان برنامه شما را با تغییرات داخلی همگام می کنند.

به عنوان مثال، این ابتدایی ترین روش اعمال inset ها در محتوای کل برنامه شما است:

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

    enableEdgeToEdge()

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

این قطعه، ورودی‌های پنجره safeDrawing را به‌عنوان بالشتک در اطراف کل محتوای برنامه اعمال می‌کند. در حالی که این تضمین می کند که عناصر قابل تعامل با رابط کاربری سیستم همپوشانی ندارند، همچنین به این معنی است که هیچ یک از برنامه ها برای دستیابی به یک جلوه لبه به لبه، پشت رابط کاربری سیستم قرار نمی گیرند. برای استفاده کامل از کل پنجره، باید جایی که ورودی‌ها بر اساس صفحه به صفحه یا جزء به جزء اعمال می‌شوند را دقیق تنظیم کنید.

همه این انواع inset به طور خودکار با انیمیشن‌های IME که به API 21 پس‌پورت شده‌اند، متحرک می‌شوند. با گسترش، همه طرح‌بندی‌های شما با استفاده از این inset‌ها نیز به‌طور خودکار با تغییر مقادیر inset متحرک می‌شوند.

دو روش اصلی برای استفاده از این انواع داخلی برای تنظیم طرح‌بندی‌های Composable وجود دارد: اصلاح‌کننده‌های padding و اصلاح‌کننده اندازه inset.

اصلاح کننده های پد

Modifier.windowInsetsPadding(windowInsets: WindowInsets) ورودی های پنجره داده شده را به عنوان padding اعمال می کند، درست مانند 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
            )
        )
    }
}

مصرف داخلی

اصلاح‌کننده‌های padding ( windowInsetsPadding و کمک‌هایی مانند safeDrawingPadding ) به‌طور خودکار بخشی از inset‌هایی را که به‌عنوان padding اعمال می‌شوند مصرف می‌کنند. در حالی که به عمق درخت ترکیب می‌روید، اصلاح‌کننده‌های بالشتک داخلی تودرتو و اصلاح‌کننده‌های اندازه درونی می‌دانند که بخشی از اینست‌ها قبلاً توسط اصلاح‌کننده‌های بالشتک داخلی خارجی مصرف شده‌اند، و از استفاده از همان بخش داخلی بیش از یک بار که منجر به فضای اضافی بیش از حد

اصلاح‌کننده‌های اندازه داخلی همچنین از استفاده بیش از یک‌بار از همان قسمت داخلی خودداری می‌کنند، در صورتی که اینست‌ها قبلاً مصرف شده باشند. با این حال، از آنجایی که آنها به طور مستقیم اندازه خود را تغییر می دهند، خودشان دمنوش ها را مصرف نمی کنند.

در نتیجه، اصلاح‌کننده‌های بالشتک تودرتو به‌طور خودکار میزان padding اعمال‌شده برای هر ترکیب‌سازی را تغییر می‌دهند.

با نگاهی به مثال LazyColumn قبلی، اندازه LazyColumn توسط اصلاح کننده imePadding تغییر می کند. در داخل LazyColumn ، آخرین مورد به اندازه ارتفاع پایین نوارهای سیستم است:

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

هنگامی که IME بسته است، اصلاح کننده imePadding() هیچ padding اعمال نمی کند، زیرا IME ارتفاع ندارد. از آنجایی که اصلاح‌کننده imePadding() هیچ بالشتکی اعمال نمی‌کند، هیچ ورودی مصرف نمی‌شود و ارتفاع Spacer به اندازه سمت پایین میله‌های سیستم خواهد بود.

هنگامی که IME باز می شود، IME برای مطابقت با اندازه IME، متحرک سازی را وارد می کند، و اصلاح کننده imePadding() شروع به اعمال padding پایین برای تغییر اندازه LazyColumn با باز شدن IME می کند. هنگامی که اصلاح کننده imePadding() شروع به اعمال لایه پایین می کند، شروع به مصرف آن مقدار inset نیز می کند. بنابراین، ارتفاع Spacer شروع به کاهش می کند، زیرا بخشی از فاصله برای نوارهای سیستم قبلاً توسط اصلاح کننده imePadding() اعمال شده است. هنگامی که اصلاح کننده imePadding() مقداری از لایه پایینی را که بزرگتر از نوارهای سیستم است اعمال می کند، ارتفاع Spacer صفر می شود.

هنگامی که IME بسته می شود، تغییرات به صورت معکوس اتفاق می افتد: زمانی که imePadding() کمتر از سمت پایین نوارهای سیستم اعمال می شود، Spacer از ارتفاع صفر شروع به گسترش می کند، تا اینکه در نهایت Spacer با ارتفاع ضلع پایینی مطابقت کند. هنگامی که IME کاملاً متحرک شد، سیستم نوار می‌شود.

شکل 2. ستون تنبل لبه به لبه با TextField

این رفتار از طریق ارتباط بین همه اصلاح‌کننده‌های windowInsetsPadding انجام می‌شود و می‌تواند به چند روش دیگر تحت تأثیر قرار گیرد.

Modifier.consumeWindowInsets(insets: WindowInsets) نیز مانند Modifier.windowInsetsPadding ، ورودی‌ها را مصرف می‌کند، اما ورودی‌های مصرف‌شده را به‌عنوان padding اعمال نمی‌کند. این در ترکیب با اصلاح‌کننده‌های اندازه داخلی مفید است، تا به خواهر و برادر نشان دهد که مقدار مشخصی از اینست قبلاً مصرف شده است:

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 ​​از ورودی‌هایی که تحت تأثیر مصرف نیستند، استفاده کنید. با این حال، با توجه به هشدارهای زیر، ترجیح می‌دهید تا حد امکان از اصلاح‌کننده‌های padding insets و تعدیل‌کننده‌های اندازه insets پنجره استفاده کنید.

مراحل Insets و Jetpack Compose

Compose از APIهای اصلی AndroidX برای به‌روزرسانی و متحرک سازی inset‌ها استفاده می‌کند، که از APIهای پلتفرم زیربنایی برای مدیریت ورودی‌ها استفاده می‌کنند. به دلیل رفتار پلتفرم، Inset ها رابطه خاصی با فازهای Jetpack Compose دارند.

ارزش inset ها پس از مرحله ترکیب، اما قبل از مرحله طرح بندی به روز می شوند. این بدان معنی است که خواندن مقدار insets در ترکیب معمولاً از مقدار insets استفاده می کند که یک فریم تاخیر دارد. اصلاح‌کننده‌های داخلی توضیح‌داده‌شده در این صفحه به گونه‌ای ساخته شده‌اند که استفاده از مقادیر ورودی‌ها را تا مرحله طرح‌بندی به تأخیر بیاندازند، که تضمین می‌کند که مقادیر ورودی در همان قاب به‌روزرسانی شده استفاده می‌شوند.

انیمیشن های صفحه کلید 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 کامپوننت

برای سهولت استفاده، بسیاری از مواد داخلی 3 composable ( androidx.compose.material3 ) بر اساس نحوه قرارگیری اجزای سازنده در برنامه شما با توجه به مشخصات Material، خود به کار می‌روند.

مواد ترکیبی هندلینگ داخلی

در زیر لیستی از اجزای متریال است که به طور خودکار inset ها را مدیریت می کنند.

نوارهای برنامه

ظروف محتوا

داربست

به طور پیش‌فرض، Scaffold ورودی‌هایی را به‌عنوان پارامتر paddingValues ​​برای مصرف و استفاده شما فراهم می‌کند. Scaffold در داخل محتوا را اعمال نمی کند. این مسئولیت با شماست به عنوان مثال، برای مصرف این inset ها با 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 به composable تغییر دهید تا رفتار composable را پیکربندی کنید. این پارامتر می تواند نوع دیگری از درج پنجره باشد که به جای آن اعمال می شود، یا با عبور دادن یک نمونه خالی غیرفعال می شود: WindowInsets(0, 0, 0, 0) .

به عنوان مثال، برای غیرفعال کردن مدیریت inset در LargeTopAppBar ، پارامتر windowInsets را روی یک نمونه خالی تنظیم کنید:

LargeTopAppBar(
    windowInsets = WindowInsets(0, 0, 0, 0),
    title = {
        Text("Hi")
    }
)

با ورودی های سیستم View تعامل داشته باشید

هنگامی که صفحه نمایش شما دارای هر دو کد Views و Compose در یک سلسله مراتب است، ممکن است لازم باشد که ورودی های پیش فرض را لغو کنید. در این مورد، شما باید به صراحت بگویید که در کدام یک از اینست ها باید مصرف کرد و کدام یک باید آنها را نادیده گرفت.

به عنوان مثال، اگر بیرونی‌ترین طرح‌بندی شما یک طرح‌بندی Android View است، باید ورودی‌های موجود در سیستم View را مصرف کنید و آنها را برای Compose نادیده بگیرید. از طرف دیگر، اگر بیرونی‌ترین چیدمان شما قابل ترکیب است، باید ورودی‌ها را در Compose مصرف کنید و بر اساس آن، Composable‌های AndroidView را پاک کنید.

به طور پیش‌فرض، هر ComposeView تمام ورودی‌ها را در سطح مصرف WindowInsetsCompat مصرف می‌کند. برای تغییر این رفتار پیش‌فرض، ComposeView.consumeWindowInsets را روی false تنظیم کنید.

منابع

  • اکنون در اندروید - یک برنامه اندروید کاملاً کاربردی که کاملاً با Kotlin و Jetpack Compose ساخته شده است.
{% کلمه به کلمه %} {% آخر کلمه %} {% کلمه به کلمه %} {% آخر کلمه %}