日/夜模式无法在初次启动时运行

时间:2019-11-28 17:43:44

标签: java android android-night-mode

这里很奇怪的问题。我正和它一起转圈!

白天/夜晚模式在我的整个应用中似乎都可以正常工作...但是仅适用于INVISIBLE可绘制对象,在初始加载时不起作用。

我有2个xml可绘制文件夹: drawabledrawable-night具有匹配的.png文件名

我有两个值文件夹: valuescolors.xmlstyles.xmlic_launcher_background.xmlstrings.xml-以及- values-nightcolors.xmlstyles.xml

在应用程序中,我使用拨动开关将模式设置为日/夜模式,如下所示。这似乎工作正常。

dayNightMode.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            System.out.println("Not Checked");
            InitApplication.getInstance().setIsNightModeEnabled(true, context);
            Intent intent = getIntent();
            intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            finish();
            startActivity(intent);
            dayNightMode.setText("Night Mode");
        } else {
            System.out.println("Checked");
            InitApplication.getInstance().setIsNightModeEnabled(false, context);
            Intent intent = getIntent();
            intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            finish();
            startActivity(intent);
            dayNightMode.setText("Day Mode");
        }
    }
});

上面的代码调用的InitApplication类是:

package com.dmurphy.remotescrumpoker;

    import android.app.Application;
    import android.content.Context;
    import android.content.SharedPreferences;
    import android.preference.PreferenceManager;
    import android.util.Log;

    public class InitApplication extends Application {
        public static final String NIGHT_MODE = "NIGHT_MODE";
        private boolean isNightModeEnabled = false;

        private static InitApplication singleton = null;

        public static InitApplication getInstance() {

            if(singleton == null)
            {
                singleton = new InitApplication();
            }
            return singleton;
        }

        @Override
        public void onCreate() {
            super.onCreate();
            singleton = this;
            Context appContext = this.getApplicationContext();

            SharedPreferences sharedPreferences = appContext.getSharedPreferences("com.dmurphy.remotescrumpoker", Context.MODE_PRIVATE);
            isNightModeEnabled = sharedPreferences.getBoolean(NIGHT_MODE, true);
            Log.i("onCreate1_", String.valueOf(isNightModeEnabled));
        }

        public boolean isNightModeEnabled(Context context) {
            SharedPreferences sharedPreferences = context.getSharedPreferences("com.dmurphy.remotescrumpoker", Context.MODE_PRIVATE);
            isNightModeEnabled = sharedPreferences.getBoolean(NIGHT_MODE, true);
            Log.i("onCreate11_", String.valueOf(isNightModeEnabled));
            return isNightModeEnabled;
        }

        public void setIsNightModeEnabled(boolean isNightModeEnabled, Context context) {
            this.isNightModeEnabled = isNightModeEnabled;
            Log.i("onCreate111_", String.valueOf(isNightModeEnabled));

            SharedPreferences sharedPreferences = context.getSharedPreferences("com.dmurphy.remotescrumpoker", Context.MODE_PRIVATE);
            sharedPreferences.edit().putBoolean(NIGHT_MODE, isNightModeEnabled).apply();
            Log.i("onCreate1111_", String.valueOf(isNightModeEnabled));
        }
    }

我也有一个Activity_Poker活动。一切正常,如果我更改开关,应用程序也会更改。

我也有启动活动Activity_Splash,在onCreate中,我检查了模式:

if (InitApplication.getInstance().isNightModeEnabled(context)) {
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
    Log.i(TAG, "onCreate1_" + "Mode Night Yes");
} else {
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
    Log.i(TAG, "onCreate1_" + "Mode Night No");
}
setContentView(R.layout.activity__splash);

启动正常。当我关闭应用程序并重新启动时,两种模式的背景色等都是正确的。我一直有3个可绘制对象VISIBLE用于该活动。这些在两种替代模式之间也可以很好地改变。

但是,我有9个可绘制对象,默认情况下不可见。这些在创建时变为可见,但它们在每次加载时始终显示DAY_MODE。

注意:可绘制对象不在错误的文件夹中。正确的颜色在正确的文件夹中。 9个无法工作的.png文件的颜色与3个VISIBLE可绘制对象的颜色匹配,它们正常工作。不会从INVISIBLE文件夹drawables-night填充默认的onCreate

如果我使用inApp用户菜单重新启动活动,则会使用NIGHT_MODEDAY_MODE可绘制对象(如果适用)正确地重新创建活动。 但是NIGHT_MODE可绘制对象(对于默认情况下不可见的Fors对象)在启动时不会使用。

预期的结果:在启动时,将不可见的ImageView更改为“可见”,并为drawables填充了DAY_MODE或为drawables-night填充了NIGHT_MODE

实际结果::在启动时,将不可见的ImageView更改为可见,并为drawables填充DAY_MODE或为drawables填充NIGHT_MODE

Activity_Poker.java

public class Activity_Poker extends AppCompatActivity {

[snip]
        Activity passedActivity = Activity_Poker.this;
[snip]
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_poker);
            drawerLayout = findViewById(R.id.drawer_layout);
    [snip]
            final String methodName = "onCreate";
            mAuth = FirebaseAuth.getInstance();
            String userId = mAuth.getUid();
    [snip]
            //Setup the UI for the selected game type
            int cardType = sharedPreferences.getInt("cardType", 0);
            Log.i(TAG, "Selected SharedPref Record: " + cardType);
            callSetupUI.setupLocalActive(passedActivity, cardType);
    [snip]
}

注意::上面的cardType从Logcat正确显示== 5。

SetupUI.java

    public void setupLocalActive(Activity passedActivity, int cardType) {

        ImageView card4 = passedActivity.findViewById(R.id.pokerCard4);
        ImageView card4img = passedActivity.findViewById(R.id.pokerCard4img);
        ImageView card5 = passedActivity.findViewById(R.id.pokerCard5);
        ImageView card5img = passedActivity.findViewById(R.id.pokerCard5img);
        ImageView card6 = passedActivity.findViewById(R.id.pokerCard6);
        ImageView card6img = passedActivity.findViewById(R.id.pokerCard6img);
        ImageView card7 = passedActivity.findViewById(R.id.pokerCard7);
        ImageView card7img = passedActivity.findViewById(R.id.pokerCard7img);
        ImageView card8 = passedActivity.findViewById(R.id.pokerCard8);
        ImageView card8img = passedActivity.findViewById(R.id.pokerCard8img);
        ImageView card9 = passedActivity.findViewById(R.id.pokerCard9);
        ImageView card9img = passedActivity.findViewById(R.id.pokerCard9img);
        ImageView card11 = passedActivity.findViewById(R.id.pokerCard11);
        ImageView card11img = passedActivity.findViewById(R.id.pokerCard11img);

        TextView card4TextView = passedActivity.findViewById(R.id.textViewPokerCard4);
        TextView card5TextView = passedActivity.findViewById(R.id.textViewPokerCard5);
        TextView card6TextView = passedActivity.findViewById(R.id.textViewPokerCard6);
        TextView card7TextView = passedActivity.findViewById(R.id.textViewPokerCard7);
        TextView card8TextView = passedActivity.findViewById(R.id.textViewPokerCard8);
        TextView card9TextView = passedActivity.findViewById(R.id.textViewPokerCard9);
        TextView card10TextView = passedActivity.findViewById(R.id.textViewPokerCard10);
        TextView card11TextView = passedActivity.findViewById(R.id.textViewPokerCard11);
        TextView card12TextView = passedActivity.findViewById(R.id.textViewPokerCard12);
        TextView card13TextView = passedActivity.findViewById(R.id.textViewPokerCard13);
        TextView card14TextView = passedActivity.findViewById(R.id.textViewPokerCard14);
        TextView card15TextView = passedActivity.findViewById(R.id.textViewPokerCard15);

        Log.i(TAG, "Selected SharedPref Record UI CardType into Switch: " + cardType);

        switch (cardType){
            case 1:
[snip]
            case 2:
[snip]
            case 3:
[snip]
            case 4:
[snip]
            case 5:
                Log.i(TAG, "Selected SharedPref Record Setting UI: " + cardType);
                card10.setVisibility(card10.INVISIBLE);
                card12.setVisibility(card12.INVISIBLE);
                card13.setVisibility(card13.INVISIBLE);
                card14.setVisibility(card14.INVISIBLE);
                card15.setVisibility(card15.INVISIBLE);
                card4TextView.setVisibility(card4TextView.INVISIBLE);
                card5TextView.setVisibility(card5TextView.INVISIBLE);
                card6TextView.setVisibility(card6TextView.INVISIBLE);
                card7TextView.setVisibility(card7TextView.INVISIBLE);
                card8TextView.setVisibility(card8TextView.INVISIBLE);
                card9TextView.setVisibility(card9TextView.INVISIBLE);
                card10TextView.setVisibility(card10TextView.INVISIBLE);
                card11TextView.setVisibility(card10TextView.INVISIBLE);
                card12TextView.setVisibility(card12TextView.INVISIBLE);
                card13TextView.setVisibility(card13TextView.INVISIBLE);
                card14TextView.setVisibility(card14TextView.INVISIBLE);
                card15TextView.setVisibility(card15TextView.INVISIBLE);

                card4img.setImageResource(R.drawable.chihuahua);
                card5img.setImageResource(R.drawable.dachshund);
                card6img.setImageResource(R.drawable.beagle);
                card7img.setImageResource(R.drawable.spaniel);
                card8img.setImageResource(R.drawable.boxer);
                card9img.setImageResource(R.drawable.shepard);
                card11img.setImageResource(R.drawable.dane);

                card4img.setVisibility(card4img.VISIBLE);
                card5img.setVisibility(card5img.VISIBLE);
                card6img.setVisibility(card6img.VISIBLE);
                card7img.setVisibility(card7img.VISIBLE);
                card8img.setVisibility(card8img.VISIBLE);
                card9img.setVisibility(card9img.VISIBLE);
                card11img.setVisibility(card11img.VISIBLE);

                break;

            default:
[snip]
                break;
        }

    }

activity_poker.xml

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:layout_editor_absoluteX="16dp"
        tools:layout_editor_absoluteY="260dp">

        <androidx.core.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            tools:layout_editor_absoluteY="8dp">

            <androidx.constraintlayout.widget.ConstraintLayout
                android:id="@+id/content_frame"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginBottom="32dp">

[snip]
        <ImageView
            android:id="@+id/pokerCard5"
            android:layout_width="88dp"
            android:layout_height="104dp"
            android:layout_marginTop="16dp"
            android:background="@color/colorPrimary"
            android:contentDescription="@string/localCardSelectcontent"
            android:onClick="card8clicked"
            app:layout_constraintEnd_toStartOf="@+id/pokerCard6"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toEndOf="@+id/pokerCard4"
            app:layout_constraintTop_toBottomOf="@+id/pokerCard2" />

        <ImageView
            android:id="@+id/pokerCard5img"
            android:layout_width="72dp"
            android:layout_height="88dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            android:contentDescription="@string/localCardSelectcontent"
            android:onClick="localcard5clicked"
            android:visibility="invisible"
            app:layout_constraintStart_toStartOf="@+id/pokerCard5"
            app:layout_constraintTop_toTopOf="@+id/pokerCard5"
            app:srcCompat="@drawable/dachshund" />

        <TextView
            android:id="@+id/textViewPokerCard5"
            android:layout_width="88dp"
            android:layout_height="104dp"
            android:onClick="localcard5clicked"
            android:gravity="center"
            android:includeFontPadding="false"
            android:textColor="@color/colorPrimaryDark"
            android:textSize="44sp"
            android:textStyle="normal|bold"
            app:layout_constraintStart_toStartOf="@+id/pokerCard5"
            app:layout_constraintTop_toTopOf="@+id/pokerCard5" />

        <ImageView
            android:id="@+id/pokerCard4"
            android:layout_width="88dp"
            android:layout_height="104dp"
            android:background="@color/colorPrimary"
            android:contentDescription="@string/localCardSelectcontent"
            android:onClick="card5clicked"
            android:visibility="visible"
            app:layout_constraintBottom_toBottomOf="@+id/pokerCard5"
            app:layout_constraintEnd_toStartOf="@+id/pokerCard5"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent" />

        <ImageView
            android:id="@+id/pokerCard4img"
            android:layout_width="72dp"
            android:layout_height="88dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            android:contentDescription="@string/localCardSelectcontent"
            android:onClick="localcard4clicked"
            android:visibility="invisible"
            app:layout_constraintStart_toStartOf="@+id/pokerCard4"
            app:layout_constraintTop_toTopOf="@+id/pokerCard4"
            app:srcCompat="@drawable/chihuahua" />

        <TextView
            android:id="@+id/textViewPokerCard4"
            android:layout_width="88dp"
            android:layout_height="104dp"
            android:onClick="localcard4clicked"
            android:gravity="center"
            android:includeFontPadding="false"
            android:textColor="@color/colorPrimaryDark"
            android:textSize="44sp"
            android:textStyle="normal|bold"
            app:layout_constraintStart_toStartOf="@+id/pokerCard4"
            app:layout_constraintTop_toTopOf="@+id/pokerCard4" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.core.widget.NestedScrollView>

<com.google.android.material.navigation.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    android:onClick="onSwitchChange"
    app:headerLayout= "@layout/nav_header_main"
    app:menu="@xml/drawer_view" >

</com.google.android.material.navigation.NavigationView>

1 个答案:

答案 0 :(得分:0)

这可能不是正确的解决方案,但是我实现了一种解决方法。

Activity_Splash中,我添加了一个bool来表示它是首次启动。

SharedPreferences sharedPreferences = Activity_Splash.this.getSharedPreferences("com.dmurphy.remotescrumpoker", Context.MODE_PRIVATE);
sharedPreferences.edit().putBoolean("initialStartup", true).apply();

在Activity_Poker中,我检索了bool,如果启用了NIGHT_MODE且'initialStartup'为true,则我重新启动Activity_Poker以重置UI。

boolean initialStartup = sharedPreferences.getBoolean("initialStartup", false);
if (InitApplication.getInstance().isNightModeEnabled(context) && initialStartup) {

    callUserMenu.menuAction(TAG, methodName, context, 5, passedActivity); //This triggers my Intent to restart the activity
    sharedPreferences.edit().remove("initialStartup").apply();
}

仍然不知道到底是什么原因造成的。