我四处寻找了一会儿,不得不"苦学":
来自androidx. fragment. app. fragmentActivity的fragmentActivity不能与文档中的更改主题的方式一起工作。
例如:您可以通过App类(扩展Application
类的类)中的AppCompatDelegate.setDefaultNightMode()
从日间主题切换到夜间主题,因为在关闭/打开应用后配置将不再持久,并确保在创建任何Activity之前完成配置更改(由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");
break;
case Configuration.UI_MODE_NIGHT_YES:
Log.i(TAG, "night mode flag set");
break;
case Configuration.UI_MODE_NIGHT_UNDEFINED:
Log.i(TAG, "night mode flag unknown");
break;
}
}
检查Activity何时读取配置。对于AppCompatActivity,这已经在onCreate()开始时发生。对于FragmentActivity,这会在稍后发生(也许有人可以澄清这发生在什么时候?),肯定是在布局inalted之后,因此布局永远不会使用夜间资源膨胀。
对我来说,最简单的解决方案是使用AppCompatActivity,因为我不需要嵌套片段的向后兼容性,也不支持API级别〈17(see this post)。
"希望这能为你们节省时间"
来源
DayNight — Adding a dark theme to your app
Activity, AppCompatActivity, FragmentActivity, and ActionBarActivity: When to Use Which?
Developing Themes with Style (Android Dev Summit '19)
1条答案
按热度按时间5us2dqdw1#
FragmentActivity
是Fragment库的一部分,不依赖于AppCompat(事实上,AppCompat依赖于Fragment),完全不知道AppCompatDelegate
和您在该对象上设置的任何夜间模式。如果您希望您的Activity能够识别
AppCompatDelegate
以及任何特定于AppCompat
的夜间模式修复,则应始终使用AppCompatActivity
。