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端的界面风格必须 ...
随机推荐
- oc调javascript方法(evaluateJavaScript:)&&js给oc发通知
在ios8中引入了WKWebView控件,通过在头文件引用 #import <WebKit/WebKit.h>来使用该控件, 这个控件与oc的原生控件uiwebview很相似,它更方便oc ...
- [转]mysql update case when和where之间的注意事项
原文地址:http://www.cnblogs.com/rwxwsblog/p/4512061.html 在日常开发中由于业务逻辑较为复杂,常常需要用到UPDATE和CASE...WHEN...THE ...
- 【Linux/CentOS】Boolean ftp_home_dir is not defined
安装完vsftpd软件后,因为CentOS系统的SELinux安全策略默认是没有开启FTP服务,直接访问会报错500 OOPS,所以需要修改为允许使用FTP服务. 目标:希望ftp用户可以访问自己的家 ...
- 未能加载文件或程序集”xxxx”或它的某一个依赖项,试图加载格式不正确的程序。
通常是因为应用程序编译的目标平台与引用的DLL类库目标平台不一致造成的,如应用程序目标编译为64位,而引用了32位的DLL. 在Visual Studio修改应用程序目标编译平台即可. 更多关于目标编 ...
- 高并发TCP连接数目问题
linux可通过五元组唯一确定一个链接:源IP,源端口,目的IP,目的端口,传输层协议.而一个端口不允许被两个及以上进程占用(一个进程可同时占用多个端口),据此是否可以推测一台linux服务器最多可以 ...
- android开发(38) 使用 DrawerLayou t实现左侧抽屉式导航菜单
最近流行 左侧抽屉式的导航条菜单,知乎,360,QQ都使用了这样的导航菜单,我们也了解下: Android Design 的流行趋势:Navigation Drawer 导航抽屉 参考这篇文章:htt ...
- Redis 实现消息队列 MQ
Redis 2.4版本之后就内置队列的功能了,如果是日常比较简单的队列应用,可以选择Redis , 效率还很高的!! Redis 还能实现 有序 和 无序 两种队列(只讨论生产者和消费者这种模式的队列 ...
- JS 二维数组排序
<script> //测试方法 var a = [ {name:'hdj', age:128}, {name:'hdj1', age:28}, {name:'hdj1', age:78}, ...
- 你必须要懂的APK瘦身知识
随着业务复杂度的逐渐增加,代码.资源也在不断的增加,此时你的APP大小也在增加.从用户层面来说,面对动辄几十兆的APP来说在非WIFI情况下还是会犹豫要不要下载,不下载你就可能因此失去了一个用户.从公 ...
- C++中构造函数,拷贝构造函数和赋值函数的区别和实现
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象 ...