How to have a properly Dark and Light Theme with Splash Screen

后端 未结 1 744
小蘑菇
小蘑菇 2020-12-12 05:38

I have read that there is a way to have a values-night and a values folder. But how to change from values to values-night before starting ,because of my splash screen. I kno

1条回答
  •  攒了一身酷
    2020-12-12 06:14

    Try below dark mode code which I am use.

    Step - 1

    First of create night folder into your resource file like below image(i.e. values-night)

    Step - 2

    Create styles,strings and colors xml file for night mode same as below image and add your night mode color,string and style which you want to show in your app when night mode was apply.

    For better user experience add window Animation in your style.

    values --> style.xml

    
    
        
        
    
        
    
        
        
    
        
        
    
    
    

    values-night --> style.xml

    
    
    
    
    
    
    
    
    

    fade_in.xml

    
    
        
        
    
    

    fade_out.xml

    
    
        
        
    
    

    Step - 3

    Add this below code in your splash screen if you want to set night mode as per device mode first time when application installed.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if (!CommonUtils.isToogleEnabled(SplashActivity.this)) {
            if (CommonUtils.isDarkMode(SplashActivity.this)) {
                CommonUtils.setIsNightModeEnabled(SplashActivity.this, true);
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
            } else {
                CommonUtils.setIsNightModeEnabled(SplashActivity.this, false);
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
            }
        } else {
            if (CommonUtils.isNightModeEnabled(SplashActivity.this)) {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
            } else {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
            }
        }
        super.onCreate(savedInstanceState);
    
        ...
        //your code
    }
    

    Step - 4

    Add this below code in your all activity

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if (CommonUtils.isNightModeEnabled(MainActivity.this)) {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
        } else {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
        }
        super.onCreate(savedInstanceState);
    
        ...
        //your code
    }
    

    Step - 5

    Change mode using below code

    private WeakReference mActivity;
    
    binding.imgNightMode.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mActivity = new WeakReference(MainActivity.this);
            CommonUtils.setIsToogleEnabled(MainActivity.this, true);
            if (CommonUtils.isNightModeEnabled(MainActivity.this)) {
                CommonUtils.setIsNightModeEnabled(MainActivity.this, false);
                mActivity.get().recreate();
            } else {
                CommonUtils.setIsNightModeEnabled(MainActivity.this, true);
                mActivity.get().recreate();
            }
        }
    });
    

    Below methods are CommonUtils.

    private static final String NIGHT_MODE = "NIGHT_MODE";
    private static final String TOOGLE = "TOOGLE";
    
    public static boolean isNightModeEnabled(Context context) {
        SharedPreferences mPrefs = context.getSharedPreferences("MY_PREF", MODE_PRIVATE);
        return mPrefs.getBoolean(NIGHT_MODE, false);
    }
    
    public static void setIsNightModeEnabled(Context context, boolean isNightModeEnabled) {
        SharedPreferences mPrefs = context.getSharedPreferences("MY_PREF", MODE_PRIVATE);
        SharedPreferences.Editor editor = mPrefs.edit();
        editor.putBoolean(NIGHT_MODE, isNightModeEnabled);
        editor.apply();
    }
    
    public static void setIsToogleEnabled(Context context, boolean isToogleEnabled) {
        SharedPreferences mPrefs = context.getSharedPreferences("MY_PREF", MODE_PRIVATE);
        SharedPreferences.Editor editor = mPrefs.edit();
        editor.putBoolean(TOOGLE, isToogleEnabled);
        editor.apply();
    }
    
    public static boolean isToogleEnabled(Context context) {
        SharedPreferences mPrefs = context.getSharedPreferences("MY_PREF", MODE_PRIVATE);
        return mPrefs.getBoolean(TOOGLE, false);
    }
    
    public static boolean isDarkMode(Activity activity) {
        return (activity.getResources().getConfiguration()
                .uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES;
    }
    

    I hope this can help you!

    Thank You.

    0 讨论(0)
提交回复
热议问题