我正在使用http://www.controlledvocabulary.com/imagedatabases/de-dupe.html中引入的AppCompat的新Theme.AppCompat.DayNight主题,但它不是自动在白天(浅色)和夜晚(黑暗)主题之间切换,而是始终显示为浅色主题。如何让它切换到黑暗的主题?
答案 0 :(得分:8)
默认情况下,是否为“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);
}
[...]
}