首页 > 解决方案 > AndroidX FragmentActivity 与暗/夜间模式更改不兼容

问题描述

我搜索了一段时间,不得不“艰难地学习”:

androidx.fragment.app.FragmentActivity 中的 FragmentActivity 不能与记录在案的更改主题的方式一起使用。

例如:您通过App 类(扩展该类的类)从白天主题切换到夜间主题AppCompatDelegate.setDefaultNightMode(),因为在关闭/打开应用程序后配置不是持久的,并确保配置更改(其中由) 触发,在创建任何活动之前完成。到目前为止一切顺利:IE An将使用首选主题创建。但是,如果您启动此活动,则不会使用为夜间模式提供的资源。onCreate()ApplicationsetDefaultNightMode()AppCompatActivityFragmentActivity

我用了

    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(请参阅这篇文章)。

希望这对你们中的一些人来说是安全的。

来源

DayNight — 为您的应用添加深色主题

Activity、AppCompatActivity、FragmentActivity 和 ActionBarActivity:什么时候使用?

以风格开发主题(Android Dev Summit '19)

标签: android

解决方案


FragmentActivity,作为 Fragment 库的一部分并且不依赖于 AppCompat(实际上,AppCompat 依赖于 Fragment)完全不知道AppCompatDelegate您在该对象上设置的任何夜间模式。

如果AppCompatActivity您希望了解您的活动AppCompatDelegate以及任何特定于AppCompat.


推荐阅读