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

ian*_*ake 6 android android-appcompat

我正在使用版本23.2中引入的AppCompat的新Theme.AppCompat.DayNight主题,但它不是自动在一天(浅色)和夜晚(暗)主题之间切换,它总是显示为浅色主题.如何让它切换到黑暗主题?

ian*_*ake 9

正如同一篇23.2博文中所述,

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

然而,截至目前,这实际上意味着它相当于MODE_NIGHT_NO触发夜间模式的唯一东西是来自Gingerbread时代的汽车码头.

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

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

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

static {
    AppCompatDelegate.setDefaultNightMode(
        AppCompatDelegate.MODE_NIGHT_...);
}
public class MyApplication extends Application {
Run Code Online (Sandbox Code Playgroud)

相反,如果您只想更改单个活动/对话框的模式,则可以改为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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

当然,克里斯的帖子也说

还要记住默认值是MODE_NIGHT_FOLLOW_SYSTEM,因此如果我们将来向平台添加用户可见设置,AppCompat将自动使用它.