AppCompat v23.2 — DayNight
2016-03-02 20:55
399 查看
在plugin新的23.2版本中,我们发现了一个新的主题:
Theme.AppCompat.DayNight.
这个主题可以让我们app实现自由切换白天和夜晚的主题,当然系统中默认的情况是通过系统时间来进行自动的切换的功能。
使用当前主题的时候需要注意的是,当我们在API 14以上使用时,这个主题才会有效果,在API 14以下的主题使用会默认使用light主题。
通过上述方法,我们就可以在app张使用这个新的特性的了,我们通过使用AppCompatDelegate.setDefaultNightMode() 方法来进行昼夜主题的设置,在其中有四个变量供我们选择:
MODE_NIGHT_NO:固定位白天主题
MODE_NIGHT_YES:固定为夜晚主题
MODE_NIGHT_AUTO:通过系统时间系统自动实现昼夜主题的切换。
MODE_NIGHT_FOLLOW_SYSTEM:这是默认的主题,更随系统的主题。
AppCompatDelegate.setDefaultNightMode() 是一个静态的方法,我们可以在任何时候使用这个方法,需要注意的是,我们设置的值并不会持续的存在,因此你需要每次都进行设置当你的app启动的时候,所以官方推荐的做法是在自定义一个application类,通过静态代码块的方法来设置,当然在activity中设置也是可以的,设置代码如下所示:
请注意,当一个页面的初始化操作已经完成了,这个方法将不会起到任何的作用,在这种情境下,你需要重新去掉用recreate()方法来进行设置,如下图所示:
切换时候看不到文字效果
图标颜色效果不对
当使用昼夜主题的时候,一定要保证你的ayouts/styles/drawables拥有白天和夜晚的主题。
当我们使用这种主题的时候,我们需要尽可能的去使用主题中的相关属性:
?android:attr/textColorPrimary.通用的文本颜色,他将会在白天主题下设置近乎黑色的文字颜色,在夜晚主题下设置近乎白色的颜色背景,如果使用不了,这使用当前颜色作为字体默认颜色。
?attr/colorControlNormal. icon图标的颜色,大体的效果跟第一点相似。
如果app没有相对应的权限,则系统会通过finger-in-the-air fixed(这是个啥)计算值,系统会标准的使用6点为白天起点,晚上10点为夜晚七点来进行切换。
res/values/themes.xml
res/values-night/themes.xml
翻译原文:
https://medium.com/@chrisbanes/appcompat-v23-2-daynight-d10f90c83e94#.t4x6lmu7w
Theme.AppCompat.DayNight.
这个主题可以让我们app实现自由切换白天和夜晚的主题,当然系统中默认的情况是通过系统时间来进行自动的切换的功能。
使用当前主题的时候需要注意的是,当我们在API 14以上使用时,这个主题才会有效果,在API 14以下的主题使用会默认使用light主题。
如何使用?
我们只需要在style文件中进行该主题的声明即可:<style name="MyTheme" parent="Theme.AppCompat.DayNight"> <!-- Blah blah --> </style>
通过上述方法,我们就可以在app张使用这个新的特性的了,我们通过使用AppCompatDelegate.setDefaultNightMode() 方法来进行昼夜主题的设置,在其中有四个变量供我们选择:
MODE_NIGHT_NO:固定位白天主题
MODE_NIGHT_YES:固定为夜晚主题
MODE_NIGHT_AUTO:通过系统时间系统自动实现昼夜主题的切换。
MODE_NIGHT_FOLLOW_SYSTEM:这是默认的主题,更随系统的主题。
AppCompatDelegate.setDefaultNightMode() 是一个静态的方法,我们可以在任何时候使用这个方法,需要注意的是,我们设置的值并不会持续的存在,因此你需要每次都进行设置当你的app启动的时候,所以官方推荐的做法是在自定义一个application类,通过静态代码块的方法来设置,当然在activity中设置也是可以的,设置代码如下所示:
static { AppCompatDelegate.setDefaultNightMode( AppCompatDelegate.MODE_NIGHT_...); } public class MyApplication extends Application {
setLocalNightMode()
你可以在任何组件中覆盖上述的4个主题值,通过使用AppCompatDelegate’s setLocalNightMode(),当你只需要特定的组件实现一个主题模式,如一个Activity或者一个Dialog,这是一个非常好用的方法。请注意,当一个页面的初始化操作已经完成了,这个方法将不会起到任何的作用,在这种情境下,你需要重新去掉用recreate()方法来进行设置,如下图所示:
public class MyActivity extends AppCompatActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { // Set the local night mode to some value getDelegate().setLocalNightMode( AppCompatDelegate.MODE_NIGHT_...); // Now recreate for it to take effect recreate(); } } }
如何确定当前app所使用的模式
我们可以通过如下方式进行确认:int currentNightMode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; switch (currentNightMode) { case Configuration.UI_MODE_NIGHT_NO: // Night mode is not active, we're in day time case Configuration.UI_MODE_NIGHT_YES: // Night mode is active, we're at night! case Configuration.UI_MODE_NIGHT_UNDEFINED: // We don't know what mode we're in, assume notnight }
使用当前注意会遇到的问题
可能会遇到的问题:切换时候看不到文字效果
图标颜色效果不对
当使用昼夜主题的时候,一定要保证你的ayouts/styles/drawables拥有白天和夜晚的主题。
当我们使用这种主题的时候,我们需要尽可能的去使用主题中的相关属性:
?android:attr/textColorPrimary.通用的文本颜色,他将会在白天主题下设置近乎黑色的文字颜色,在夜晚主题下设置近乎白色的颜色背景,如果使用不了,这使用当前颜色作为字体默认颜色。
?attr/colorControlNormal. icon图标的颜色,大体的效果跟第一点相似。
WebViews
使用这种新特性的时候,有一个非常大的问题存在:WebView,因为他们并不能使用主题相关的属性,你也几乎不能去控制任何网页的style,在其中有很大的概率网页的显示效果跟当前主题拥有很大的冲突性,如WebView白色,而主题是黑色的,所以尽量的去检查这些方面的问题。地理位置
为了能够准确的计算到实际中夜晚的切换时间,需要能够定位到地理位置,如果app中已经有了定位的权限,AppCompat会通过LocationManager获取最近时间的地理位置去计算切换时间。如果app没有相对应的权限,则系统会通过finger-in-the-air fixed(这是个啥)计算值,系统会标准的使用6点为白天起点,晚上10点为夜晚七点来进行切换。
在昼夜切换的时候,如何使用自己的资源
我们可以通过如下方法来进行自定义的昼夜的主题的切换:res/values/themes.xml
<style name="Theme.AppCompat.DayNight" parent="Theme.AppCompat.Light" />
res/values-night/themes.xml
<style name="Theme.AppCompat.DayNight" parent="Theme.AppCompat" />
翻译原文:
https://medium.com/@chrisbanes/appcompat-v23-2-daynight-d10f90c83e94#.t4x6lmu7w
相关文章推荐
- iOS 中的 NSoperation 多线程
- Magcodes.WeiChat——自定义CustomCreationConverter之实现微信自定义菜单的序列化
- Android学习笔记之ContentProvider
- android:EditText控件imeOptions属性
- getScrollx/getScrollY的理解
- 如何Android中加入扫描名片功能
- iOS socket编程
- ios开发之多线程理论
- LitePal框架上手小记录
- HDU 1017 A Mathematical Curiosity(数学题目)
- iOS 后台运行实现
- 项目记录25--unity-tolua框架 View02---BasePanel.lua
- Activity中的intent的FLAG代表的意义
- [iOS学习]关于多线程和NSThread
- 在Objective-C中,字符串的搜索
- ios autolayout中NSLayoutAttributeLeft(Right)与NSLayoutAttributeLeading(Trailing)区别
- iOS中的 多线程- NSThread 与 NSObject
- Apply()和call() @知乎
- 进程、多线程
- iOS App粗略上架流程20160302