How to set specific fragment to only Dark theme while rest of the app is DayNight?

Issue

This Content is from Stack Overflow. Question asked by Marat

In my app I have one fragment where I need to use colors only from dark theme pallet.

My base AppTheme is extending from DayNight and I have colors.xml in both values and values-night folder with different hex colors for light and dark themes.

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    <item name="android:windowBackground">@color/surfacePrimary</item>
    <item name="colorPrimary">@color/surfacePrimary</item>
    <item name="colorPrimaryDark">@color/surfacePrimary</item>
        ...
</style>

In this article from Chris Banes I found out that DayNight is basicaly

in values:
<style name="Theme.AppCompat.DayNight" parent="Theme.AppCompat.Light" />

and in values-night:
<style name="Theme.AppCompat.DayNight" parent="Theme.AppCompat" />

I tried to create a separate AppTheme that doesn’t extend from DayNight with hope that this theme will use colors from values-night folder.

<style name="AppTheme.Dark" parent="Theme.MaterialComponents.NoActionBar">
    <item name="android:windowBackground">@color/surfacePrimary</item>
    <item name="colorPrimary">@color/surfacePrimary</item>
    <item name="colorPrimaryDark">@color/surfacePrimary</item>
        ...
</style>

As you can see color attributes still points to the same colors in both themes but those colors have different hex in values/colors.xml and values-night/colors.xml. Then applied Dark theme in onCreateView of needed fragment:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    activity?.theme?.applyStyle(R.style.AppTheme_Dark, true)
    return inflater.inflate(R.layout.fragment_b, container, false)
}

But this did not work out. I know that I could add separate independent colors just for this fragment and set their hex to be always equal to one in dark mode. But I would really like to avoid it and use already existing colors I have.

How can I force AppTheme.Dark to use colors from values-night/colors.xml?



Solution

This question is not yet answered, be the first one who answer using the comment. Later the confirmed answer will be published as the solution.

This Question and Answer are collected from stackoverflow and tested by JTuto community, is licensed under the terms of CC BY-SA 2.5. - CC BY-SA 3.0. - CC BY-SA 4.0.

people found this article helpful. What about you?