AppCompat DayNight主题总是显示为Light主题?

时间:2016-02-26 00:11:20

标签: android android-appcompat

我正在使用http://www.controlledvocabulary.com/imagedatabases/de-dupe.html中引入的AppCompat的新Theme.AppCompat.DayNight主题,但它不是自动在白天(浅色)和夜晚(黑暗)主题之间切换,而是始终显示为浅色主题。如何让它切换到黑暗的主题?

2 个答案:

答案 0 :(得分:8)

that same 23.2 blog post中所述,

  

默认情况下,是否为“night”将匹配系统值(来自UiModeManager.getNightMode()

然而,截至目前,这实际上意味着它相当于MODE_NIGHT_NO,因为触发夜间模式的唯一因素是姜饼时代的停车场。

这意味着在当前设备上,在使用DayNight主题时查看黑暗主题的唯一方法是使用NIGHT_MODE_YES或NIGHT_MODE_AUTO

正如官方帖子和Chris Banes' post on DayNight中所述,您可以在全局级别或本地级别更改模式。

全局级别依赖于静态AppCompatDelegate.setDefaultNightMode()方法,该方法在整个应用程序中设置DayNight模式。因为这只适用于您的进程处于活动状态(即,它只是一个内存标志),您需要确保每次启动应用程序时都设置它。 Chris发布的一个推荐方法是将其设置为自定义Application类的静态方法:

static {
    AppCompatDelegate.setDefaultNightMode(
        AppCompatDelegate.MODE_NIGHT_...);
}
public class MyApplication extends Application {

相反,如果您只想更改单个活动/对话框的模式,则可以改为呼叫getDelegate().setLocalNightMode()

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();
    }
  }
}

这只会更改单个实例 - 您会注意到recreate()的调用 - 已经充气的视图不会受到夜间模式更改的影响,因此您可以强制活动重新创建获取更新的值。

当然,克里斯的帖子也说明了

  

另外请记住默认值为MODE_NIGHT_FOLLOW_SYSTEM,因此如果我们将来向平台添加用户可见设置,AppCompat会自动使用它。

答案 1 :(得分:4)

Android Lollipop中似乎有一个错误,AppCompat 23.2.0 Google Issue Tracker

以下代码仅适用于Lollipop之前:

public class MyApplication extends Application {
    static {
    AppCompatDelegate.setDefaultNightMode(
        AppCompatDelegate.MODE_NIGHT_YES);
    }
    [...]
}
相关问题