大家好 我是 菠萝派
目前我知道的有三种 日夜间模式的切换方式:
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