web-dev-qa-db-ja.com

Androidスプラッシュスクリーンのテキストと背景色を、スマホがライトモードまたはダークモードで変化するようにするにはどうすればよいですか?

私はしばらくこれに取り組んでおり、残念ながら私は画像を使用せずに目的の効果を得ることができませんでした。私はスタックオーバーフローおよびほとんどどこでも調査しましたが、これを正確に行うソリューションはまだ見つかりませんでした。

私がまだやろうとしているのはこれです:

  • 電話がライトモードになっている>スプラッシュ画面の背景が白で、中央に黒のABCという単語

  • スマートフォンが暗いモードになっている>スプラッシュ画面の背景が黒で、中央に白のABCという単語がある

ここに私がこれまでに持っているものがあります:

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() { }
    }
}

これは画像を使用していますが、テキストで実行したいと思います。

誰かがそれを行う方法を知っていますか?私はこれを可能な限り調査し、2つのAndroid devsからの助けを求めましたが、それでも画像を使用せずにこれを行う簡単な解決策を考え出すことはできません。

テキストのみでnot Xamarinの画像でこれを行うことは可能ですかAndroidアプリケーション?

5
Alan2

これは、アプリに昼/夜のテーマを実装するためのシンプルで最適なソリューションです。手順に従ってください。

ステップ1:DayNightテーマに変更

Styles.xmlファイルに移動し、親テーマをDayNightに変更します

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

</style>

これにより、アプリは昼と夜の構成変更を検出できるようになります。注:他のテーマと同様に、これにもTheme.AppCompat.DayNight.NoActionBarなどのバリエーションがあります

ステップ2: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はアクティビティウィンドウの背景のデフォルトの属性です。

ニーズとテーマとスタイルの理解に基づいて、後で別のアプローチを選択できます。

ステップ3:色を定義する

Colors.xmlに移動して、これらの色を追加します。

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

ステップ4:夜修飾子カラーファイルを作成する

その方法Android Studio:値フォルダを右クリック->新規->値リソースファイル。ファイルに「colors」という名前を付け、それにNightMode修飾子を追加します。

これにより、存在しない場合は「values-night」フォルダーとその中にcolors.xmlが作成されます。

Xamarin開発に使用しているIDEでこのアプローチが不可能な場合は、ファイルを手動で作成してください:「res」フォルダーの下に「values-night」フォルダーを作成し、次に「 「values-night」フォルダの下のcolors.xmlファイル。

ステップ5:NightMode認定カラーファイルで同じ色を定義する

「values-night」フォルダの下に新しく作成されたcolors.xmlファイルに移動し、これらの色を追加します。

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

色リソース名は同じですが、値が異なることに注意してください。

ステップ6:テーマを使用

ステップ1で定義したスタイルを、アプリ全体のテーマまたはスプラッシュアクティビティのテーマとして設定します。 (あなたはすでにこれをしました)

これで、アプリケーションは昼夜構成に反応するようになります。

テスト

Android version> = Qのデバイスでプロジェクトを実行し、デバイスのナイトモードのオン/オフを切り替えます。

Orこれらのコードをアプリケーションクラスの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
Nezih Yılmaz

Androidに関するドキュメント代替リソースの提供)からの引用の一部を以下に示します。

追加 情報

ナイトモード

_night
notnight
_
  • 夜:夜間
  • notnight:日中

APIレベル8で追加されました。

夜間モードが自動モード(デフォルト)のままになっている場合、これはアプリの存続中に変更される可能性があります。その場合、モードは時刻に基づいて変更されます。 UiModeManagerを使用して、このモードを有効または無効にできます。これがランタイム中にアプリにどのように影響するかについては、ランタイム変更の処理を参照してください。


(スプラッシュスクリーンごとにスタイルがあるため、この手順を既に実行したかどうかはわかりませんが、テキストの色を変更できなかったので、この手順をとにかく含めます)

1º-2つの描画可能なXMLファイルを作成

splash_screen.xmlおよびsplash_screen_night.xmlという2つの描画可能なファイルを作成します。

_<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_というフォルダーを作成し、ライトテーマのスプラッシュスクリーンを実装するvaluesという既存のフォルダーに追加します。

注:ここで「マジック」が発生します。Androidは、デバイスのNightModeに応じて値または値-nightを使用します。notnightはnightと同じように動作しますが、DayModeの場合

Values-nightフォルダー内に空の_styles.xml_ファイルを作成し、ダークテーマスプラッシュスクリーンを含めるようにスタイルを追加します。

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

そしてもちろん、_values>style.xaml_では、Ligthテーマのスプラッシュ画面

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

3ºMainLativity.csを更新して新しいLauchThemeを使用する

MainActivityを更新して、新しく作成されたLaunchThemeをスプラッシュスクリーンとして使用するようにします。次の値を使用するアクティビティ属性:

_Theme = "@style/LaunchTheme"
LaunchMode = LaunchMode.SingleTop
_

例えば。:

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

そして、_base.OnCreate_の前のOnCreateメソッドで:

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

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

    //...
}
_
0

this コードを使用してデバイスのテーマを決定し、それに基づいてテキストと色を設定できます。

0
Sahil Doshi