博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android学习之——切换应用主题实现日间和夜间效果的更换
阅读量:6156 次
发布时间:2019-06-21

本文共 4098 字,大约阅读时间需要 13 分钟。

前言

智能手机的迅速普及,大大的丰富了我们的娱乐生活。现在大家都喜欢晚上睡觉前玩会儿手机,但是应用的日间模式往往亮度太大,对眼睛有较为严重的伤害。

因此,如今的应用往往开发了日间和夜间两种模式供用户切换使用,那日间和夜间模式切换究竟是怎样实现的呢?这就是我们今天学习的内容。

思路

  • 设置主题:

setTheme(int resid)

setTheme()方法应该被在Context中的所有View被实例化之前被调用(例如在setContentView(View)之前)。如下所示:

setTheme(theme);    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);
  • 主题样式:

为了简单在这里我们使用继承自Theme.AppCompat.Light.DarkActionBar的主题样式来代替日间模式。如有其他要求,可以自定义来实现。

同理,使用继承自Theme.AppCompat的主题样式来代替夜间模式。

  • 重新生成activity

由setTheme()方法只能在View实例化之前被调用,所以,在切换主题后,需要重新生成一次activity以调用setTheme()方法。

Intent intent = getIntent();    overridePendingTransition(0, 0);//不设置进入退出动画    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);    finish();    overridePendingTransition(0, 0);    startActivity(intent);
  • 保存主题到本地

使用SharedPreferences保存用户所选主题到本地。

public class SharedPreferrenceHelper { private static final String THEME = "theme"; public static void settheme(Context context,String theme){    SharedPreferences sp = context.getSharedPreferences("demo",Context.MODE_PRIVATE);    SharedPreferences.Editor editor = sp.edit();    editor.putString(THEME,theme);    editor.apply(); } public static String gettheme(Context context){    SharedPreferences sp = context.getSharedPreferences("demo",Context.MODE_PRIVATE);    return sp.getString(THEME,"1"); } }
  • 获得用户所选主题和切换主题

获得应用主题。

public static int getAppTheme(Context context){String value = SharedPreferrenceHelper.gettheme(context);switch (Integer.valueOf(value)){    case 1:        return R.style.AppTheme;    case 2:        return R.style.AppThemeDark;    default:        return R.style.AppTheme; } }

切换主题。

public static void switchAppTheme(Context context){    String value = SharedPreferrenceHelper.gettheme(context);    switch (Integer.valueOf(value)){        case 1:            SharedPreferrenceHelper.settheme(context,"2");            break;        case 2:            SharedPreferrenceHelper.settheme(context,"1");            break;        default:            SharedPreferrenceHelper.settheme(context,"1");            break;    }}

全部代码

public class MainActivity extends ActionBarActivity {TextView mTextView;private int theme = 0;private static final String TAG = "MainActivity";@Overrideprotected void onResume() {    Log.d(TAG,"onResume");    super.onResume();    if(theme==Utils.getAppTheme(this)){    }else{       reload();    }}@Overrideprotected void onDestroy() {    super.onDestroy();    Log.d(TAG,"onDestroy");}@Overrideprotected void onSaveInstanceState(Bundle outState) {    super.onSaveInstanceState(outState);    outState.putInt("theme",theme);}@Overrideprotected void onCreate(Bundle savedInstanceState) {    if(savedInstanceState==null){        theme=Utils.getAppTheme(this);    }else{        theme=savedInstanceState.getInt("theme");    }    setTheme(theme);    super.onCreate(savedInstanceState);    Log.d(TAG,"onCreate");    setContentView(R.layout.activity_main);   ...}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {    // Inflate the menu; this adds items to the action bar if it is present.    getMenuInflater().inflate(R.menu.menu_main, menu);    return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {    // Handle action bar item clicks here. The action bar will    // automatically handle clicks on the Home/Up button, so long    // as you specify a parent activity in AndroidManifest.xml.    int id = item.getItemId();    //noinspection SimplifiableIfStatement    if (id == R.id.action_settings) {        return true;    }    if(id==R.id.action_switch_theme){        Utils.switchAppTheme(this);        reload();        return true;    }    return super.onOptionsItemSelected(item);}public void reload() {    Intent intent = getIntent();    overridePendingTransition(0, 0);//不设置进入退出动画    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);    finish();    overridePendingTransition(0, 0);    startActivity(intent);}@Overrideprotected void onRestart() {    super.onRestart();    Log.d(TAG, "onRestart");}@Overrideprotected void onPause() {    super.onPause();    Log.d(TAG,"onPause");}}

效果图

效果图

原文地址:http://www.cnblogs.com/JohnTsai/p/4550144.html
你可能感兴趣的文章
the assignment of reading paper
查看>>
android apk 逆向中常用工具一览
查看>>
MyEclipse 报错 Errors running builder 'JavaScript Validator' on project......
查看>>
Skip List——跳表,一个高效的索引技术
查看>>
Yii2单元测试初探
查看>>
五、字典
查看>>
前端js之JavaScript
查看>>
Log4J日志配置详解
查看>>
实验7 BindService模拟通信
查看>>
scanf
查看>>
Socket编程注意接收缓冲区大小
查看>>
SpringMVC初写(五)拦截器
查看>>
检测oracle数据库坏块的方法
查看>>
SQL server 安装教程
查看>>
Linux下ftp和ssh详解
查看>>
跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击
查看>>
js时间和时间戳之间如何转换(汇总)
查看>>
js插件---图片懒加载echo.js结合 Amaze UI ScrollSpy 使用
查看>>
java中string和int的相互转换
查看>>
P1666 前缀单词
查看>>