Android Support Library 之 夜间模式

bozin 8年前
   <h2>前言</h2>    <p>夜间模式实现方式</p>    <p>1、通过切换theme来实现夜间模式。</p>    <p>优点:可以匹配多套主题,并不局限于黑白模式</p>    <p>缺点:需要大量定义主题</p>    <p>详见博客: <a href="/misc/goto?guid=4959675349369333104" rel="nofollow,noindex">http://wuxiaolong.me/2015/08/19/ChangeTheme/</a></p>    <p>2、通过修改uiMode来切换夜间模式。修改uimode是修改Configuration,这种主题切换只限于黑白模式,没有其他模式,即本文介绍的内容。</p>    <h2>效果预览</h2>    <p><img src="https://simg.open-open.com/show/f03c8e1a0807483930e6c755ed79286b.gif"></p>    <h2>如何使用</h2>    <h2>第一步</h2>    <p>(1)app/build.gradle</p>    <pre>  <code class="language-java">compile 'com.android.support:appcompat-v7:24.0.0'  </code></pre>    <p>(2)Activity须继承AppCompatActivity</p>    <p>(3)Theme.AppCompat.DayNight</p>    <pre>  <code class="language-java"><style name="AppTheme" parent="Theme.AppCompat.DayNight">      <!-- Customize your theme here. -->      <item name="colorPrimary">@color/colorPrimary</item>      <item name="colorPrimaryDark">@color/colorPrimaryDark</item>      <item name="colorAccent">@color/colorAccent</item>  </style>  <style name="AppTheme.NoActionBar">      <item name="windowActionBar">false</item>      <item name="windowNoTitle">true</item>  </style>  </code></pre>    <h2>第二步</h2>    <p>应用全局主题推荐在 Application 的onCreate()中进行设置AppCompatDelegate.setDefaultNightMode(int mode);</p>    <p>它有四个可选值,分别是:</p>    <p>MODE_NIGHT_NO: 使用亮色(light)主题,不使用夜间模式</p>    <p>MODE_NIGHT_YES:使用暗色(dark)主题,使用夜间模式</p>    <p>MODE_NIGHT_AUTO:根据当前时间自动切换 亮色(light)/暗色(dark)主题</p>    <p>MODE_NIGHT_FOLLOW_SYSTEM(默认选项):设置为跟随系统,通常为 MODE_NIGHT_NO</p>    <h2>第三步</h2>    <p>动态的设定主题,需要切换主题调用:</p>    <pre>  <code class="language-java">AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);  //调用recreate()使设置生效  recreate();  </code></pre>    <h2>注意事项</h2>    <h2>setDefaultNightMode()与setLocalNightMode()区别</h2>    <p>AppCompatDelegate.setDefaultNightMode()是对整个App中theme为DayNight主题生效getDelegate().setLocalNightMode()只对特定的组件生效</p>    <h2>夜间资源</h2>    <p>把夜晚主题的color等资源放在values-night中,程序在运行时就会自动调用</p>    <h2>获取应用当前的主题</h2>    <pre>  <code class="language-java">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  }  </code></pre>    <p>如果切换了主题,本想通过这个方法,下次启动程序的时候,来设置。发现并没有记住这个值,还是只能SharedPreference读取,然后根据用户设置,调用 setDefaultNightMode() 方法。</p>    <h2>适配文字图片</h2>    <p>尽可能的使用主题属性(theme attributes)</p>    <ul>     <li> <p>android:textColor=”?android:attr/textColorPrimary” 或者android:textColor=”?android:textColorPrimary”系统默认的文字颜色。在亮色(light)主题下,颜色接近黑色,在暗色(dark)主题下,颜色接近白色。</p> </li>     <li> <p>android:background=”?android:colorBackground”系统默认的背景颜色</p> </li>     <li> <p>?attr/colorControlNormal. 系统默认的图标颜色</p> </li>    </ul>    <h2>源码地址</h2>    <p><a href="/misc/goto?guid=4959675349477250356" rel="nofollow,noindex">https://github.com/WuXiaolong/DesignSupportLibrarySample</a></p>    <p> </p>    <p><a href="/misc/goto?guid=4959675349549359838">阅读原文</a></p>    <p> </p>