android日夜间模式的切换:

大家好 我是 菠萝派

目前我知道的有三种 日夜间模式的切换方式:

1.设置setTheme 主题用来切换

2.设置asl(Android Support Library)中的 UiMode来支持日间/夜间模式的切换

3.通过资源id的映射 回调自定义ThemeChangeListener接口来处理日间页间模式的切换

今天就介绍一下第一种方式:

step1:

在values->color中设置两种颜色 一种day 一种night

step2:

在values->style中设置两种主题 依旧是day  right

设置一个自定义属性 在values->attrs->mainbackground

主要是用来替换的 在layout_xml中把backgroud设置成mainBackground

step3:

设置一下布局要把 属性需要设置进去 要在哪个界面显示就需要在哪个界面设置该属性

step4:

在activity中写逻辑

附上activity代码

package com.demoyoho.day_night_patternacativity;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

/**
 * @author yjh
 * msg:日夜間模式的切換
 * // FIXME: 2019/3/30
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "YJH";
    private Button btn;
    private int theme = R.style.DayAppTheme;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null) {
            /**
             * 调用生命周期就会走该方法
             * */
            theme = savedInstanceState.getInt("theme");
            setTheme(theme);
            Log.e(TAG, "onCreate: savedInstanceState");
        }
        Log.e(TAG, "onCreate: ");
        setContentView(R.layout.activity_main);
        btn = findViewById(R.id.btn_theme);
        btn.setOnClickListener(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.e(TAG, "onResume: ");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.e(TAG, "onStart: ");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.e(TAG, "onStop: ");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e(TAG, "onDestroy: ");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.e(TAG, "onRestart: " );
    }

    @Override
    public void onClick(View v) {
        theme = (theme == R.style.DayAppTheme) ? R.style.NightAppTheme : R.style.DayAppTheme;
        Log.e(TAG, "onClick: ");
        MainActivity.this.recreate();
        Log.e(TAG, "onClick: recreate");
    }


    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        /**
         * putInt( String key,int value)
         * 将int值插入此Bundle的映射中,替换给定键的任何现有值。
         *
         * Bundle 就好比一个信封 里面有很多信件
         * 而我们需要把信件存放到信封里 怎么存 就需要put进去
         * 给每一个信件一个名字 这个名字就是这个信件
         *                key                 values
         * */
        outState.putInt("theme", theme);
        Log.e(TAG, "onSaveInstanceState: ");
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        theme = savedInstanceState.getInt("theme");
        Log.e(TAG, "onRestoreInstanceState: ");
    }
}

onSaveInstanceState是用来保存UI状态的,你可以使用它保存你所想保存的东西,在Activity杀死之前,它一般在onStop或者onPause之前触发,举个列子就好比 看小说 看的看的手机自动关机了 等到重启后 点开小说 还是加载到了你看的位置 onRestoreInstanceState则是在onResume之前触发回复状态,至于复写这个方法后onCreate方法是否会被调用。

onSaveInstanceState实在活动被系统意外停止被销毁的时候调用

onRestoreInstanceState()在onStart() 和 onPostCreate(Bundle)之间调用。

onPostCreate(Bundle)实在onStart或者onRestoreInstanceState()之后调用的

通用生命周期流程如下:

正常启动 onCreate onStart onPost onCreate onResume onPostResume

转向下一个activity onPause onStop

从下一个activity返回当前(按机器返回键)onRestart onStart onResume onPostResume

转向上一个activity(按机器返回键)onPause onStop onDestory

屏幕待机(黑掉)onPause

屏幕变亮 onResume onPostResume

Home键退出 onPause onStop

Home键导航返回 onRestart onStart onResume onPostResume

旋转屏幕 onPause onStop onDestory onCreate onStart onPostCreate onResume onPostResume

onSaveInstanceState与onRestoreInstanceState参考

https://www.jianshu.com/p/5dde143a143f

猜你喜欢

转载自blog.csdn.net/qq_41914317/article/details/88928608
今日推荐