android - AndroidX FragmentActivity 与暗/夜间模式更改不兼容
问题描述
我搜索了一段时间,不得不“艰难地学习”:
androidx.fragment.app.FragmentActivity 中的 FragmentActivity 不能与记录在案的更改主题的方式一起使用。
例如:您通过App 类(扩展该类的类)从白天主题切换到夜间主题AppCompatDelegate.setDefaultNightMode()
,因为在关闭/打开应用程序后配置不是持久的,并确保配置更改(其中由) 触发,在创建任何活动之前完成。到目前为止一切顺利:IE An将使用首选主题创建。但是,如果您启动此活动,则不会使用为夜间模式提供的资源。onCreate()
Application
setDefaultNightMode()
AppCompatActivity
FragmentActivity
我用了
void checkNightModeConfiguration() {
int currentNightMode = getResources().getConfiguration().uiMode
& Configuration.UI_MODE_NIGHT_MASK
switch (currentNightMode) {
case Configuration.UI_MODE_NIGHT_NO:
Log.i(TAG, "night mode flag NOT set");
case Configuration.UI_MODE_NIGHT_YES:
Log.i(TAG, "night mode flag set");
case Configuration.UI_MODE_NIGHT_UNDEFINED:
Log.i(TAG, "night mode flag unknown");
}
}
检查活动何时读出配置。对于 AppCompatActivity,这已经发生在 onCreate() 的开头。对于 FragmentActivity,这会在一段时间后发生(也许有人可以澄清这发生在什么时候?),绝对是在布局膨胀之后,因此布局永远不会因夜间资源而膨胀。
对我来说,最简单的解决方案是改用 AppCompatActivity,因为我不需要嵌套片段的向后兼容性并且不支持 API Level < 17(请参阅这篇文章)。
希望这对你们中的一些人来说是安全的。
来源
Activity、AppCompatActivity、FragmentActivity 和 ActionBarActivity:什么时候使用?
解决方案
FragmentActivity
,作为 Fragment 库的一部分并且不依赖于 AppCompat(实际上,AppCompat 依赖于 Fragment)完全不知道AppCompatDelegate
您在该对象上设置的任何夜间模式。
如果AppCompatActivity
您希望了解您的活动AppCompatDelegate
以及任何特定于AppCompat
.
推荐阅读
- ruby - 传递字符串 [] 或列表
为 Ruby 中 EventWhoIds 的 Salesforce 批量作业 - javascript - 关于在标签中本地导入和从 Web 导入
- html - CSS Flexbox (start,center,end) on fullscreen
- javascript - Discord js - How to keep reacting to a message and editing the embed till a given time period
- javascript - Test multiple states making http requests
- sql - PostgreSQL select and count column from table on different conditions
- java - Two separate stream operations merged into one
- vue.js - 如何更改 vuetify 主题背景颜色
- java - Java nio Files: readAllBytes vs readAllLines ? Which to use when?
- python - Python Scrapy - How can I reset/clear memory of visited urls for scrapy "dont_filter=False"?