Android学习之——切换应用主题实现日间和夜间效果的更换
前言
智能手机的迅速普及,大大的丰富了我们的娱乐生活。现在大家都喜欢晚上睡觉前玩会儿手机,但是应用的日间模式往往亮度太大,对眼睛有较为严重的伤害。
因此,如今的应用往往开发了日间和夜间两种模式供用户切换使用,那日间和夜间模式切换究竟是怎样实现的呢?这就是我们今天学习的内容。
思路
- 设置主题:
setTheme(int resid)
setTheme()方法应该被在Context中的所有View被实例化之前被调用(例如在setContentView(View)之前)。如下所示:
setTheme(theme);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
- 主题样式:
为了简单在这里我们使用继承自Theme.AppCompat.Light.DarkActionBar的主题样式来代替日间模式。如有其他要求,可以自定义来实现。
同理,使用继承自Theme.AppCompat的主题样式来代替夜间模式。
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
</style>
<style name="AppThemeDark" parent="Theme.AppCompat">
</style>
* 重新生成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";
@Override
protected void onResume() {
Log.d(TAG,"onResume");
super.onResume();
if(theme==Utils.getAppTheme(this)){
}else{
reload();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG,"onDestroy");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("theme",theme);
}
@Override
protected 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);
...
}
@Override
public 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;
}
@Override
public 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);
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG,"onPause");
}
}
效果图

Android学习之——切换应用主题实现日间和夜间效果的更换的更多相关文章
- Android学习笔记(九) 视图的应用布局效果
最近少了写博客,可能最近忙吧,工作上忙,因为工作原因也忙于学习,也没记录什么了,也没有按照之前的计划去学习了.现在就记录一下最近学到的. 要做Android应用,界面设计少不了,可惜之前一直在用Win ...
- android学习日记03--常用控件checkbox/radiobutton
常用控件3.checkbox 复选框,确定是否勾选,点击一下勾选,点击第二下取消,当有一系列备选项时适合用checkbox控件,方便用户提交数据. 贴上例子Activity的java代码 packag ...
- 【转】 Pro Android学习笔记(九六):AsyncTask(5):横竖屏切换问题
目录(?)[-] 横竖屏切换的问题 WeakReference 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flow ...
- 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果
目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...
- Android学习笔记之滑动翻页(屏幕切换)
如何实现手机上手动滑动翻页效果呢?呵呵,在这里我们就给你们介绍一下吧. 一般实现这个特效会用到一个控件:ViewFlipper <1>View切换的控件—ViewFlipper 这个控件是 ...
- Android 学习资料收集
收集整理这份资料灵感来自于 trip_to_iOS, 征得同意引用了该资料的开头描述 收集整理这份资料主要帮助初学者学习 Android 开发, 希望能快速帮助到他们快速入门, 找到适合自己学习资料, ...
- Android学习路线(二十四)ActionBar Fragment运用最佳实践
转载请注明出处:http://blog.csdn.net/sweetvvck/article/details/38645297 通过前面的几篇博客.大家看到了Google是怎样解释action bar ...
- Android学习(三)
学号 20189214 <Android程序开发>第八周学习总结 教材学习内容总结 GridView GridView和ListView一样是AbsListView的子类; 都需要一个Ad ...
- Android学习之基础知识十五 — 最佳UI体验(Material Design实战)
一.前言 长久以来,大多数人都认为Android系统的UI并不美观,至少没有iOS系统的美观.以至于很多IT公司在进行应用界面设计的时候,为了保证双平台的统一性,强制要求Android端的界面风格必须 ...
随机推荐
- 基于jQuery悬停图片变色放大特效
分享一款基于jQuery悬停图片变色放大特效是一款响应式鼠标悬停图片放大效果代码.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div style="width ...
- Web基础 HTML CSS JS JQuery AJAX
1. Web基础 网页的骨骼HTML 什么是HTML超文本标记语言:Hyper Text Markup Language 这都不重要,重要的是:HTML是Web网页的基本组成部分HTML中定义的元素, ...
- win8中完成进度
public sealed partial class WorkItem : Page { private IAsyncAction _threadPoolWorkItem; private Manu ...
- sam9260 adc module
/* * driver/char/at91_adc.c * * Copyright (C) 2007 Embedall Technology Co., Ltd. * * Analog-to-digit ...
- ListView@常用属性记录
android:stackFromBottom="true" | "false" 默认false 说明:当listview加载完毕,显示最下面的内容,或者显示最 ...
- systemd&systemctl
systemd is a system and service manager for Linux operating systems. When run as first process on bo ...
- android 中解析json格式数据
本文来自http://tonysun3544.iteye.com/category/188238 package com.tony.json; import android.app.Activity; ...
- linq操作符:元素操作符
元素操作符仅返回一个元素. 一.Fitst操作符 First操作符将返回序列中的第一个元素.如果序列中不包含任何元素,则First<T>方法将引发异常.来看看First()方法的定义: 从 ...
- PCL点云特征描述与提取(2)
点特征直方图(PFH)描述子 正如点特征表示法所示,表面法线和曲率估计是某个点周围的几何特征基本表示法.虽然计算非常快速容易,但是无法获得太多信息,因为它们只使用很少的几个参数值来近似表示一个点的k邻 ...
- matlab std函数 用法及实例
MATLAB常常用到std函数来进行标准差计算,下面我就通过实例介绍一下 matlab std函数怎么用. 1. std函数是用来计算标准偏差的一个函数,由于其有不同的参数,我们就用下面的例子进行介绍 ...