Adaptation de la commutation du mode jour et nuit d'Android et la solution à la destruction et au redémarrage de l'activité causée par celle-ci

Table des matières

1. Pour basculer entre le mode blanc et le mode nuit, détruisez et redémarrez l'activité à résoudre :

2. Adaptation en mode sombre

 1. Ajoutez des dépendances :

  2. Copiez la méthode de classe d'outils suivante et utilisez-la directement :

3. Adaptation des ressources :

 4. Rappel d'adaptation :

5. Précautions pour passer en mode nuit blanche :


1. Pour basculer entre le mode blanc et le mode nuit, détruisez et redémarrez l'activité à résoudre :

        Lorsque le mode nuit blanche est activé, l'activité est détruite et rechargée. Google espère que le rechargement de l'activité peut rafraîchir l'interface utilisateur de la page, mais mon application n'est pas adaptée au mode sombre, donc l'expérience utilisateur est très mauvaise. La solution est :

Ajoutez ou ajoutez l' attribut android:configChanges="uiMode" à Activiyty dans AndroidManifest.xml :

 Détails du paramètre configChanges :

 

2. Adaptation en mode sombre

 1. Ajoutez des dépendances :

api 'com.android.support:appcompat-v7:24.1.1' 或者更高版本
或使用androidx的依赖都可以

  2. Copiez la méthode de classe d'outils suivante et utilisez-la directement :

/**
 * 暗黑模式适配工具类
 */
public class DarkModeUtils {

    public static final String KEY_MODE = "white_night_mode_sp";

    /**
     * 在 Application 的 onCreate() 方法中调用
     */
    public static void init(Application application) {
        int nightMode = getNightModel(application);
        AppCompatDelegate.setDefaultNightMode(nightMode);
    }

    /**
     * 应用夜间模式
     */
    public static void applyNightMode(Context context) {
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
        setNightModel(context, AppCompatDelegate.MODE_NIGHT_YES);
    }

    /**
     * 应用日间模式
     */
    public static void applyDayMode(Context context) {
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
        setNightModel(context, AppCompatDelegate.MODE_NIGHT_NO);
    }

    /**
     * 跟随系统主题时需要动态切换
     */
    public static void applySystemMode(Context context) {
        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
        setNightModel(context, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
    }

    /**
     * 判断App当前是否处于暗黑模式状态
     */
    public static boolean isDarkMode(Context context) {
        int nightMode = getNightModel(context);
        if (nightMode == AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) {
            int applicationUiMode = context.getResources().getConfiguration().uiMode;
            int systemMode = applicationUiMode & Configuration.UI_MODE_NIGHT_MASK;
            return systemMode == Configuration.UI_MODE_NIGHT_YES;
        } else {
            return nightMode == AppCompatDelegate.MODE_NIGHT_YES;
        }
    }

    private static int getNightModel(Context context) {
        SharedPreferences sp = context.getSharedPreferences(KEY_MODE, Context.MODE_PRIVATE);
        return sp.getInt(KEY_MODE, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
    }

    public static void setNightModel(Context context, int nightMode) {
        SharedPreferences sp = context.getSharedPreferences(KEY_MODE, Context.MODE_PRIVATE);
        sp.edit().putInt(KEY_MODE, nightMode).apply();
    }

}

3. Adaptation des ressources :

       Créez un dossier en mode sombre pour les images et les couleurs, et le système utilisera automatiquement les ressources de ce dossier lors du passage en mode sombre :

 4. Rappel d'adaptation :

Si l'attribut android:configChanges="uiMode" est ajouté ou ajouté  , le onConfigurationChanged() de l'Activity sera rappelé après le changement de mode . Il est recommandé de réécrire cette méthode dans BaseActivity et d'y apporter les adaptations correspondantes.

Vous pouvez appeler la méthode DarkModeUtils.isDarkMode(this) dans la classe d'outils ci-dessus pour déterminer si elle est en mode sombre. Vous pouvez également appeler la méthode dans la classe d'outils pour basculer le mode nuit blanche de l'application. Les notes sont les suivantes :

5. Précautions pour passer en mode nuit blanche :

(1) Appelez DarkModeUtils.init(this) dans la méthode onCreate() de Application pour initialiser la classe d'outils ;

(2) Appelez la méthode DarkModeUtils.applySystemMode(this) pour basculer entre les modes blanc et nuit du système adaptatif ;

(3) Si la dépendance d'androidx est utilisée, elle peut être appelée directement.

(4) Si vous utilisez des dépendances de support, vous devez appeler manuellement la méthode recreate() de Activity pour reconstruire la page ou effectuer différentes adaptations pour toutes les vues de la page.

Exemple d'appel direct de la méthode recreate() pour reconstruire la page :

 Exemple de réglage du mode blanc et nuit pour chaque vue de la page :

(5) Voir le code source ci-dessous pour des raisons spécifiques :

version androidx :

/**
     * Sets the default night mode. This is the default value used for all components, but can
     * be overridden locally via {@link #setLocalNightMode(int)}.
     *
     * <p>This is the primary method to control the DayNight functionality, since it allows
     * the delegates to avoid unnecessary recreations when possible.</p>
     *
     * <p>If this method is called after any host components with attached
     * {@link AppCompatDelegate}s have been 'started', a {@code uiMode} configuration change
     * will occur in each. This may result in those components being recreated, depending
     * on their manifest configuration.</p>
     *
     * <p>Defaults to {@link #MODE_NIGHT_FOLLOW_SYSTEM}.</p>
     *
     * @see #setLocalNightMode(int)
     * @see #getDefaultNightMode()
     */
    public static void setDefaultNightMode(@NightMode int mode) {
        switch (mode) {
            case MODE_NIGHT_NO:
            case MODE_NIGHT_YES:
            case MODE_NIGHT_FOLLOW_SYSTEM:
            case MODE_NIGHT_AUTO_TIME:
            case MODE_NIGHT_AUTO_BATTERY:
                if (sDefaultNightMode != mode) {
                    sDefaultNightMode = mode;
                    applyDayNightToActiveDelegates();
                }
                break;
            default:
                Log.d(TAG, "setDefaultNightMode() called with an unknown mode");
                break;
        }
    }

versions prises en charge :

public static void setDefaultNightMode(int mode) {
        switch(mode) {
        case -1:
        case 0:
        case 1:
        case 2:
            sDefaultNightMode = mode;
            break;
        default:
            Log.d("AppCompatDelegate", "setDefaultNightMode() called with an unknown mode");
        }
    }

Après comparaison, on peut constater qu'après qu'Androidx soit passé en mode sombre, il a activement appelé la méthode applyDayNightToActiveDelegates() pour reconstruire l'activité. Mais il n'y a pas de soutien, juste une affectation. Par conséquent, l'utilisation de la version de support nécessite d'appeler la méthode recreate() de l'activité à reconstruire.

Je suppose que tu aimes

Origine blog.csdn.net/zhao8856234/article/details/126578124
conseillé
Classement