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

附上源码

https://github.com/Spider-007/Night_DatActivity

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值