اجرای تم تیره

روش Compose را امتحان کنید
Jetpack Compose جعبه ابزار UI توصیه شده برای اندروید است. با نحوه کار با طرح زمینه در Compose آشنا شوید.

شکل 1. تم تیره.

طرح زمینه تیره در Android 10 (سطح API 29) و بالاتر در دسترس است. دارای مزایای زیر است:

  • بسته به فناوری صفحه نمایش دستگاه، مصرف انرژی را به میزان قابل توجهی کاهش می دهد.
  • دید را برای کاربران با دید کم و کسانی که به نور روشن حساس هستند بهبود می بخشد.
  • استفاده از دستگاه را در محیط های کم نور آسان تر می کند.

طرح زمینه تیره برای رابط کاربری سیستم Android و برنامه‌های در حال اجرا در دستگاه اعمال می‌شود.

سه راه برای فعال کردن تم تیره در اندروید 10 و بالاتر وجود دارد:

  • با رفتن به Settings > Display > Theme از تنظیمات سیستم برای فعال کردن تم تیره استفاده کنید.
  • در صورت فعال بودن، از کاشی تنظیمات سریع برای تعویض تم ها از سینی اعلان استفاده کنید.
  • در دستگاه‌های Pixel، حالت بهینه‌سازی باتری را فعال کنید تا همزمان طرح زمینه تیره را فعال کنید. ممکن است دستگاه‌های دیگر از این رفتار پشتیبانی نکنند.

برای دستورالعمل‌های اعمال یک تم تیره به محتوای مبتنی بر وب با استفاده از مؤلفه WebView، به Darken web content در WebView مراجعه کنید.

از تم تیره در برنامه خود پشتیبانی کنید

برای پشتیبانی از طرح زمینه تیره، تم برنامه خود را - که معمولاً در res/values/styles.xml یافت می‌شود - تنظیم کنید تا از یک طرح زمینه DayNight به ارث ببرد:

<style name="AppTheme" parent="Theme.AppCompat.DayNight">

همچنین می توانید از تم تیره Material Components استفاده کنید:

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">

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

تم ها و سبک ها

از استفاده از رنگ‌ها یا نمادهایی که برای استفاده در یک تم روشن در نظر گرفته شده‌اند خودداری کنید. به جای آن از ویژگی‌های موضوع یا منابع شبانه استفاده کنید.

دو ویژگی تم برای تم تاریک از همه مهمتر هستند:

  • ?android:attr/textColorPrimary : یک رنگ متن همه منظوره. در تم روشن تقریباً سیاه و در تم‌های تاریک تقریباً سفید است. دارای حالت غیرفعال است.
  • ?attr/colorControlNormal : یک رنگ نماد همه منظوره. دارای حالت غیرفعال است.

توصیه می کنیم از مواد طراحی متریال استفاده کنید، زیرا سیستم تم رنگی آن، مانند ویژگی های تم ?attr/colorSurface و ?attr/colorOnSurface ، دسترسی آسان به رنگ های مناسب را فراهم می کند. شما می توانید این ویژگی ها را در موضوع خود سفارشی کنید.

تغییر تم ها در برنامه

می‌توانید در حین اجرای برنامه به کاربران اجازه دهید تم برنامه را تغییر دهند. گزینه های زیر پیشنهاد می شوند:

  • نور
  • تاریک
  • پیش فرض سیستم (گزینه پیش فرض توصیه شده)

این گزینه‌ها مستقیماً به حالت‌های AppCompat.DayNight نگاشت می‌شوند:

برای تغییر موضوع، موارد زیر را انجام دهید:

  • در سطح API 31 و بالاتر، از UiModeManager#setApplicationNightMode استفاده کنید تا به سیستم اطلاع دهید که برنامه شما چه تمی را اجرا می کند. این به سیستم امکان می‌دهد در طول صفحه نمایش چلپ چلوپ، موضوع را مطابقت دهد.

  • در سطح API 30 و پایین تر، از AppCompatDelegate.setDefaultNightMode() برای تغییر تم استفاده کنید.

نیروی تاریک

Android 10 Force Dark را ارائه می‌کند، قابلیتی برای توسعه‌دهندگان که می‌توانند به سرعت یک تم تیره را بدون تنظیم صریح تم DayNight پیاده‌سازی کنند.

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

برنامه‌ها باید با تنظیم android:forceDarkAllowed="true" در طرح زمینه فعالیت، تاریکی اجباری را انتخاب کنند. این ویژگی روی تمام تم‌های روشن ارائه‌شده توسط سیستم و AndroidX، مانند Theme.Material.Light تنظیم می‌شود. هنگامی که از Force Dark استفاده می کنید، برنامه خود را به طور کامل آزمایش کنید و در صورت نیاز، نماها را حذف کنید.

اگر برنامه شما از طرح زمینه تیره مانند Theme.Material استفاده می‌کند، Force Dark اعمال نمی‌شود. به طور مشابه، اگر طرح زمینه برنامه شما از یک طرح زمینه DayNight به ارث می رسد، به دلیل تغییر خودکار تم، تاریکی اجباری اعمال نمی شود.

اجباری تاریکی را در نما غیرفعال کنید

Force Dark را می توان روی نماهای خاص با ویژگی طرح بندی android:forceDarkAllowed یا با setForceDarkAllowed() کنترل کرد.

محتوای وب

برای کسب اطلاعات در مورد استفاده از تم های تیره در محتوای مبتنی بر وب، به Darken web content در WebView مراجعه کنید. برای مثالی از تم تیره اعمال شده در WebView، به نسخه نمایشی WebView در GitHub مراجعه کنید.

بهترین شیوه ها

بخش‌های زیر بهترین روش‌ها را برای پیاده‌سازی تم‌های تاریک ارائه می‌کنند.

اعلان ها و ویجت ها

برای سطوح رابط کاربری که روی دستگاه نمایش می‌دهید، اما مستقیماً آن‌ها را کنترل نمی‌کنید، مطمئن شوید که نماهایی که استفاده می‌کنید، موضوع برنامه میزبان را منعکس می‌کنند. دو نمونه اعلان‌ها و ابزارک‌های راه‌انداز هستند.

اطلاعیه ها

از الگوهای اعلان ارائه شده توسط سیستم، مانند MessagingStyle استفاده کنید. این بدان معناست که سیستم مسئول اعمال سبک نمای صحیح است.

ویجت ها و نماهای اعلان سفارشی

برای ابزارک‌های راه‌انداز، یا اگر برنامه‌تان از نماهای محتوای اعلان سفارشی استفاده می‌کند، محتوا را روی تم‌های روشن و تاریک آزمایش کنید.

مشکلات رایجی که باید به آنها توجه کرد شامل موارد زیر است:

  • با فرض اینکه رنگ پس زمینه همیشه روشن باشد.
  • رنگ های متن هاردکدینگ
  • تنظیم رنگ پس‌زمینه کدگذاری‌شده هنگام استفاده از رنگ متن پیش‌فرض.
  • با استفاده از یک نماد قابل ترسیم که یک رنگ ثابت است.

در تمام این موارد، به جای رنگ های کدگذاری شده، از ویژگی های تم مناسب استفاده کنید.

صفحه های راه اندازی

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

هر رنگ کد سختی مانند رنگ های پس زمینه را که به صورت برنامه ریزی شده روی سفید تنظیم شده اند حذف کنید. به جای آن از ویژگی تم ?android:attr/colorBackground استفاده کنید.

تغییرات پیکربندی

هنگامی که تم برنامه تغییر می کند، یا از طریق تنظیمات سیستم یا AppCompat، باعث تغییر پیکربندی uiMode می شود. این به این معنی است که فعالیت ها به طور خودکار بازآفرینی می شوند.

در برخی موارد، ممکن است بخواهید برنامه ای تغییر پیکربندی را انجام دهد. به عنوان مثال، ممکن است بخواهید تغییر پیکربندی را به تاخیر بیندازید زیرا یک ویدیو در حال پخش است.

یک برنامه می‌تواند با اعلام اینکه هر Activity می‌تواند تغییر پیکربندی uiMode را انجام دهد، اجرای تم تیره را انجام دهد:

<activity
    android:name=".MyActivity"
    android:configChanges="uiMode" />

هنگامی که یک Activity اعلام می کند که تغییرات پیکربندی را کنترل می کند، متد onConfigurationChanged() آن زمانی فراخوانی می شود که یک تغییر موضوع وجود داشته باشد.

برای بررسی اینکه موضوع فعلی چیست، برنامه‌ها می‌توانند کدهای زیر را اجرا کنند:

کاتلین

val currentNightMode = configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
when (currentNightMode) {
    Configuration.UI_MODE_NIGHT_NO -> {} // Night mode is not active, we're using the light theme.
    Configuration.UI_MODE_NIGHT_YES -> {} // Night mode is active, we're using dark theme.
}

جاوا

int currentNightMode = configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK;
switch (currentNightMode) {
    case Configuration.UI_MODE_NIGHT_NO:
        // Night mode is not active, we're using the light theme
        break;
    case Configuration.UI_MODE_NIGHT_YES:
        // Night mode is active, we're using dark theme
        break;
}