Как я могу сделать экран Android spla sh с текстом и цветом фона, который меняется, если мой телефон находится в светлом или темном режиме? - PullRequest
5 голосов
/ 29 февраля 2020

Я работал над этим в течение некоторого времени, и, к сожалению, я не смог достичь желаемого эффекта без использования изображения. Я исследовал переполнение стека и почти везде и до сих пор не нашел решения, которое бы точно так и сделало.

Я все еще пытаюсь сделать следующее:

  • Телефон подключен светлый режим> Spla sh экран имеет белый фон со словом AB C черного цвета в центре

  • Телефон находится в темном режиме> Spla sh экран имеет черный фон со словом AB C белого цвета в центре

Вот что у меня есть:

SplashActivity.cs

namespace Japanese.Droid
{
    [Activity(Label = "Anki+", Theme = "@style/LaunchTheme", MainLauncher = true, NoHistory = true)]
    public class SplashActivity : Activity
    {

styles.xaml

<style name="LaunchTheme" parent="Theme.AppCompat">
    <item name="android:windowBackground">@drawable/splash_screen</item>
    <item name="android:navigationBarColor">#ffffff</item>
</style>

splash_screen.xaml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/white"/>
    <item>
        <bitmap android:src="@drawable/splash_logo"
                android:tileMode="disabled"
                android:gravity="center"
                android:layout_gravity="center"/>
    </item>
</layer-list>

splash_screen_night.xaml

<?xml version="1.0" encoding="UTF-8" ?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/black"/>
    <item>
        <bitmap android:src="@drawable/splash_logo"
                android:tileMode="disabled"
                android:gravity="center"
                android:layout_gravity="center"/>
    </item>
</layer-list>

splash_activity

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Support.V7.App;
using Android.Views;

namespace Test.Droid
{
    [Activity(Label = "Test+", Theme = "@style/LaunchTheme", MainLauncher = true, NoHistory = true)]
    public class SplashActivity : Activity
    {

        public override void OnCreate(Bundle savedInstanceState, PersistableBundle persistentState)
        {
            base.OnCreate(savedInstanceState, persistentState);

            //==================================== Code to hide the bottom 3 buttons on Android.
            int uiOptions = (int)Window.DecorView.SystemUiVisibility;
            uiOptions |= (int)SystemUiFlags.LowProfile;
            uiOptions |= (int)SystemUiFlags.Fullscreen;
            uiOptions |= (int)SystemUiFlags.HideNavigation;
            uiOptions |= (int)SystemUiFlags.ImmersiveSticky;
            Window.DecorView.SystemUiVisibility = (StatusBarVisibility)uiOptions;
            //===================================

            base.SetTheme(Resource.Style.MainTheme);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        }

        // Launches the startup task
        protected override void OnResume()
        {
            base.OnResume();

            //==================================== Code to hide the bottom 3 buttons on Android.
            int uiOptions = (int)Window.DecorView.SystemUiVisibility;
            uiOptions |= (int)SystemUiFlags.LowProfile;
            uiOptions |= (int)SystemUiFlags.Fullscreen;
            uiOptions |= (int)SystemUiFlags.HideNavigation;
            uiOptions |= (int)SystemUiFlags.ImmersiveSticky;
            Window.DecorView.SystemUiVisibility = (StatusBarVisibility)uiOptions;
            //===================================

            System.Threading.Tasks.Task startupWork = new System.Threading.Tasks.Task(() => { SimulateStartup(); });
            startupWork.Start();
        }


        // Simulates background work that happens behind the splash screen
        async void SimulateStartup()
        {
            await System.Threading.Tasks.Task.Delay(1000); // Simulate a bit of startup work.
            StartActivity(new Intent(Application.Context, typeof(MainActivity)));
        }

        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }

        public override void OnBackPressed() { }
    }
}

Это использует изображение, но я хотел бы сделать это с текстом.

Кто-нибудь знает способ сделать это. Я исследовал это в максимально возможной степени, попросил помощи у двух Android разработчиков, но до сих пор никто не может придумать простое решение сделать это без использования изображения.

Можно ли сделать это только с текстом, а , а не , изображением для моего приложения Xamarin Android?

Ответы [ 7 ]

3 голосов
/ 04 марта 2020

Чтобы добиться этого, вам нужно сделать SplashScreen. xml в папке Layout в Android Project. Также вам нужно сделать стили в двух папках values ​​и values-night.

Также вам нужен отдельный SplashActivity.cs. Я прилагаю код при этом.

  1. SplashScreen. xml

      <?xml version="1.0" encoding="utf-8"?>
      <RelativeLayout 
       xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:gravity="center_vertical" 
       android:background="#fff"
       android:id="@+id/splashview">
       <TextView
            android:id="@+id/txtAppVersion"
            android:text="Anki+"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_marginLeft="30dp"
            android:layout_marginBottom="30dp"
            android:textColor="#000"
            android:textSize="24sp"
            android:gravity="center_vertical" 
            android:layout_centerHorizontal="true"/>
        </RelativeLayout>
    
  2. Стили. xml в папке значений.

    <style name="MainTheme" parent="MainTheme.Base">
        <item name="android:textAllCaps">false</item>
    </style>
    
    <style name="MainTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="windowActionModeOverlay">true</item>
        <item name="elevation">0dp</item>
    </style>
    
    <style name="LaunchTheme" parent="Theme.AppCompat">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowActionBar">false</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowDisablePreview">true</item>
    </style>
    

  3. Стили. xml в папке ночных значений.

    <style name="MainTheme" parent="MainTheme.Base">
        <item name="android:textAllCaps">false</item>
    </style>
    
    <style name="MainTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="windowActionModeOverlay">true</item>
        <item name="elevation">0dp</item>
    </style>
    
    <style name="LaunchTheme" parent="Theme.AppCompat">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowActionBar">false</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowDisablePreview">true</item>
    </style>
    

  4. SplashActivity.cs

    using System;
    using Android.App;
    using Android.Content;
    using Android.Content.Res;
    using Android.OS;
    using Android.Runtime;
    using Android.Views;
    using Android.Widget;
    using Plugin.CurrentActivity;
    
    namespace MyProject.Droid
    {
        [Activity(Label = "MyProject+", Theme = "@style/LaunchTheme", 
    MainLauncher = true, NoHistory = true)]
    public class SplashActivity : Activity
    {
    
        public override void OnCreate(Bundle savedInstanceState, PersistableBundle persistentState)
        {
            base.OnCreate(savedInstanceState, persistentState);
    
            //==================================== Code to hide the bottom 3 buttons on Android.
            int uiOptions = (int)Window.DecorView.SystemUiVisibility;
            uiOptions |= (int)SystemUiFlags.LowProfile;
            uiOptions |= (int)SystemUiFlags.Fullscreen;
            uiOptions |= (int)SystemUiFlags.HideNavigation;
            uiOptions |= (int)SystemUiFlags.ImmersiveSticky;
            Window.DecorView.SystemUiVisibility = (StatusBarVisibility)uiOptions;
            //===================================
    
            base.SetTheme(Resource.Style.MainTheme);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        }
    
        // Launches the startup task
        protected override void OnResume()
        {
            base.OnResume();
            SetContentView(Resource.Layout.SplashScreen);
            bool isDarkTheme;
    
            //var isDarkTheme = Preferences.Get("isDarkTheme", false);
            if (Build.VERSION.SdkInt >= BuildVersionCodes.Froyo)
            {
                var uiModeFlags = CrossCurrentActivity.Current.AppContext.Resources.Configuration.UiMode & UiMode.NightMask;
                if (uiModeFlags == UiMode.NightYes)
                    isDarkTheme = true;
                else isDarkTheme = false;
            }
            else
                isDarkTheme = false;
    
            if (isDarkTheme)
            {
                FindViewById<RelativeLayout>(Resource.Id.splashview).SetBackgroundColor(Android.Graphics.Color.ParseColor("#000000"));
                FindViewById<TextView>(Resource.Id.txtAppVersion).SetTextColor(Android.Graphics.Color.ParseColor("#FFFFFF"));
            }
            else
            {
                FindViewById<RelativeLayout>(Resource.Id.splashview).SetBackgroundColor(Android.Graphics.Color.ParseColor("#FFFFFF"));
                FindViewById<TextView>(Resource.Id.txtAppVersion).SetTextColor(Android.Graphics.Color.ParseColor("#000000"));
            }
    
            // FindViewById<TextView>(Resource.Id.txtAppVersion).Text = $"Version {PackageManager.GetPackageInfo(PackageName, 0).VersionName}";
    
            //==================================== Code to hide the bottom 3 buttons on Android.
            int uiOptions = (int)Window.DecorView.SystemUiVisibility;
            uiOptions |= (int)SystemUiFlags.LowProfile;
            uiOptions |= (int)SystemUiFlags.Fullscreen;
            uiOptions |= (int)SystemUiFlags.HideNavigation;
            uiOptions |= (int)SystemUiFlags.ImmersiveSticky;
            Window.DecorView.SystemUiVisibility = (StatusBarVisibility)uiOptions;
            //===================================
    
            System.Threading.Tasks.Task startupWork = new System.Threading.Tasks.Task(() => { SimulateStartup(); });
            startupWork.Start();
        }
    
        // Simulates background work that happens behind the splash screen
        async void SimulateStartup()
        {
            await System.Threading.Tasks.Task.Delay(1000); // Simulate a bit of startup work.
            StartActivity(new Intent(Application.Context, typeof(MainActivity)));
        }
    
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    
        public override void OnBackPressed() { }
    }
    }
    
2 голосов
/ 29 февраля 2020

Вы пробовали использовать дневную тему? что-то вроде этого в вашем файле стиля

<style name="LaunchTheme" parent="Theme.AppCompat.DayNight">
<item name="android:windowBackground">@drawable/splash_screen</item>
<item name="android:navigationBarColor">#ffffff</item>
</style>

Дайте мне знать, если это работает!

1 голос
/ 06 марта 2020

Создание цветов для фона и переднего плана в двух папках значений в папке res:

  • values-night папка для ночного режима
  • values папка для дневного режима

для ночь в режиме res/values-night/colors.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="splashForeground">#FFFFFF</color>
    <color name="splashBackground">#000000</color>
</resources>

для день в режиме res/values/colors.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="splashForeground">#000000</color>
    <color name="splashBackground">#FFFFFF</color>
</resources>

в вашем макете для экрана spla sh используйте цвета res/layout/splash.xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView  xmlns:android="http://schemas.android.com/apk/res/android"
        android:text="ABC"
        android:textColor="@color/splashForeground"
        android:background="@color/splashBackground"

        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="24sp"
        />
1 голос
/ 04 марта 2020

На самом деле вам не нужен SplashActivity. Просто используйте список слоев splash_screen. xml в вашей папке для рисования. Установите Theme вашего MainActivty в SplashTheme и в OnCreate вашего MainActivity перед базой вызовов. OnCreate добавьте строку SetTheme (Resource.Style.RealApplicationTheme), чтобы реальный AppTheme вступил во владение.

Убедитесь, что Ваша тема spla sh содержит следующее

<item name="android:windowBackground">@drawable/splash_screen</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>

Таким образом, экран spla sh будет оставаться на экране столько, сколько требуется устройству для холодного запуска. Поэтому вам не нужно беспокоиться об обработке дополнительных действий и искусственного тайм-аута. Вы можете измерить время отображения, просто выполнив поиск по строке «display» в журналах, которая будет содержать фактический период времени холодного запуска. Sub 1 se c время отображения достижимо.

Очевидно, что при более поздних теплых запусках вы вряд ли увидите экран spla sh, потому что время запуска намного быстрее, так как ваше приложение уже находится в памяти.

Как только вы все сделаете правильно, включите трассировку при запуске, чтобы ускорить время запуска.

0 голосов
/ 08 марта 2020

Это простое и оптимальное решение для реализации темы День / Ночь для вашего приложения. Пожалуйста, следуйте инструкциям.

Шаг первый: перейдите на тему DayNight

Перейдите к файлу стилей. xml и измените родительскую тему на DayNight

<style name="LaunchTheme" parent="Theme.AppCompat.DayNight">
    <!-- Theme attributes -->

</style>

Это позволит вашему приложению обнаруживать изменения конфигурации дня и ночи. Примечание. Как и другие темы, эта тема также имеет свои варианты, такие как Theme.AppCompat.DayNight.NoActionBar

Шаг второй: добавьте атрибуты в свою тему DayNight

<style name="LaunchTheme" parent="Theme.AppCompat.DayNight.NoActionBar">

    <!-- Other attributes might be present here by default such as 'colorPrimary' -->

    <!-- These colors are going to be defined on next step -->
    <item name="android:textColor">@color/textColor</item>
    <item name="android:windowBackground">@color/windowBackgroundColor</item>
</style>

Для этого Например, мы используем атрибуты textColor и windowBackground. textColor является атрибутом цвета по умолчанию для всего приложения, а windowBackground является атрибутом по умолчанию для фонов окон деятельности.

Позже вы можете выбрать другой подход в зависимости от ваших потребностей и понимания тем и стилей.

Шаг третий: определение цветов

Перейдите к своим цветам. xml и добавьте эти цвета.

<resources>
<color name="textColor">#000000</color>
<color name="windowBackgroundColor">#FFFFFF</color>
</resources>

Шаг четвертый: Создайте файл цветов ночного квалификатора

Как это делается в Android Studio: Щелкните правой кнопкой мыши папку значений -> Создать -> Файл ресурсов значений, назовите свой файл 'colors' и добавьте в него NightMode Qualifier.

Это, если не существует, создаст папку 'values-night' и цвета. xml в ней.

Если этот подход невозможно в IDE, которую вы используете для разработки Xamarin, пожалуйста, создайте файлы вручную: в папке 'res' создайте папку 'values-night'. А затем создайте файл 'colors. xml' в папке 'values-night'.

Шаг пятый: Определите те же цвета в файле квалифицированных цветов NightMode

Перейдите во вновь созданные цвета. xml файл в папке «values-night» и добавьте эти цвета.

<resources>
<color name="textColor">#FFFFFF</color>
<color name="windowBackgroundColor">#000000</color>
</resources>

Обратите внимание, что имена цветовых ресурсов одинаковы, но имеют разные значения.

Шаг шестой: используйте тему

Установите стиль, который вы определили на первом этапе, в качестве темы для всего приложения или в качестве темы деятельности Spla sh. (Вы уже сделали это)

Готово, ваше приложение теперь будет реагировать на настройки день / ночь.

Тестирование

Запустить проект на устройстве с Android version> = Q и включением / выключением ночного режима устройств.

или добавьте этот код в функцию onCreate класса вашего приложения

AppCompatDelegate.setDefaultNightMode(
        AppCompatDelegate.MODE_NIGHT_YES); // This code will force night mode configuration for your app. Add it to see how your app looks in night mode.

AppCompatDelegate.setDefaultNightMode(
        AppCompatDelegate.MODE_NIGHT_NO); // This code will force day mode configuration for your app. Add it to see how your app looks in day mode.

Важно. Убедитесь, что вы не переопределяете ожидаемый визуальный результат, например, устанавливая жестко закодированное значение цвета непосредственно в TextView.

0 голосов
/ 03 марта 2020

Вот несколько цитат из Android Документации по Предоставлению альтернативных ресурсов .

Дополнительно Информация .

Ночной режим

night
notnight
  • Ночь: Ночное время
  • Ночь: Дневное время

Добавлен на уровне API 8.

Это может измениться в течение срока службы вашего приложения, если ночной режим оставить в автоматическом режиме (по умолчанию), и в этом случае режим изменяется в зависимости от времени суток. Вы можете включить или отключить этот режим с помощью UiModeManager. См. Обработка изменений во время выполнения для получения информации о том, как это влияет на ваше приложение во время выполнения.


(Я не знаю, если вы уже сделали эти шаги, так как у вас есть стиль для каждого spla sh экран, но так как вы не можете изменить цвет текста, я все равно включу эти шаги)

1º - Создать 2 Drawable XML файлов

Создать 2 нарисованные файлы с именем splash_screen. xml и splash_screen_night. xml:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque">
    <item>
        <TextView
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:gravity="center"
          android:textColor="#00000"
          android:text="Text in Center" />
    </item>
</layer-list>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque">
    <item>
        <TextView
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:gravity="center"
          android:textColor="#FFFFFF"
          android:text="Text in Center" />
    </item>
</layer-list>

2º - Создать тему ночи

Создайте папку с именем values-night для реализации экрана Dark Theme spla sh и добавьте в существующую папку с именем values для реализации экрана Light Theme spla sh.

Примечание: здесь, где происходит «magi c», Android будет использовать значения или значения night в зависимости от ночного режима устройства, notnight будет делать то же самое, что и night, но для DayMode

В папке values-night создайте пустой файл styles.xml и объявление d Стиль, включающий экран Dark Theme spla sh:

<resources>
    <style name="LaunchTheme" parent="Theme.AppCompat">
        <item name="android:windowBackground">@drawable/splash_screen_night</item>
    </style>
</resources>

И, конечно же, в values>style.xaml экран Ligth Theme spla sh

<style name="LaunchTheme" parent="MainTheme">
    <item name="android:windowBackground">@drawable/splash_screen</item>
</style>

3º Обновите файл MainActivity.cs, чтобы использовать новый LauchTheme

Обновите MainActivity, чтобы он использовал вновь созданную LaunchTheme в качестве экрана Spla sh. Атрибут Activity для использования следующих значений:

Theme = "@style/LaunchTheme"
LaunchMode = LaunchMode.SingleTop

EG:

[Activity(Label = "DarkModeSplashScreen", Icon = "@mipmap/icon", Theme = "@style/LaunchTheme", LaunchMode = LaunchMode.SingleTop, MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]

А затем в методе OnCreate перед base.OnCreate:

protected override void OnCreate(Bundle savedInstanceState)
{
    //...

    base.SetTheme(Resource.Style.MainTheme);
    base.OnCreate(savedInstanceState);

    //...
}
0 голосов
/ 03 марта 2020

Вы можете использовать этот код для определения темы устройства и на основании этого вы можете установить текст и цвет.

...