使用 AppCompatDelegate.setDefaultNightMode() 设置 DayNight 主题不适用于 FragmentActivity
Setting DayNight theme using AppCompatDelegate.setDefaultNightMode() not working for FragmentActivity
我有点纳闷。我在我的应用程序中使用 DayNight 主题(使用 AppCompatDelegate.setDefaultNightMode()
),但无法在我的 MainActivity
中使用它。
MainActivity
(扩展 FragmentActivity
)似乎从未设置为深色主题 - 它始终保持浅色主题。
我尝试直接在我的 MainActivity 中设置主题:
@Override
protected void onCreate(Bundle savedInstanceState) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
super.onCreate(savedInstanceState);
// create main activity.
}
但这不起作用。
我已经使用 ?attr/colorReference 正确设置了布局文件中的所有颜色。有人知道这里出了什么问题吗?
编辑:
我的styles.xml如下:
<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
<!--Default typeface and colors:-->
<item name="android:typeface">monospace</item>
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="colorAccentDarker">@color/colorAccentDarker</item>
<item name="colorAccentDarker_80percent">@color/colorAccentDarker_80percent</item>
<!--Show people's own wallpaper background-->
<item name="android:windowShowWallpaper">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
MainActivity
(which extends FragmentActivity
)
FragmentActivity
不知道 AppCompat。 AppCompatDelegate
仅供 AppCompatActivity
使用,否则您必须 wire it manually 进行其他活动。
您可以扩展 AppCompatActivity
而不是 FragmentActivity
。
AppCompatActivity
比 FragmentActivity
有 3 个特色,即
1 通过 setSupportActionBar(Toolbar) 使用操作栏,包括操作项、导航模式等 API。
2 Built-in 通过使用 Theme.AppCompat.DayNight 主题和 AppCompatDelegate.setDefaultNightMode(int) API.[=35= 在明暗主题之间切换]
3 通过使用 getDrawerToggleDelegate() 与 DrawerLayout 集成 API.
并且我们需要 2nd 点来实现 activity 以 支持 自动切换主题。
这是Kotlin中的代码:
class MainActivity: FragmentActivity(), AppCompatCallback{
init{
initDelegate()
}
private var mDelegate: AppCompatDelegate? = null
override fun setTheme(@StyleRes resId: Int) {
super.setTheme(resId)
getDelegate()?.setTheme(resId)
}
fun initDelegate() {
savedStateRegistry.registerSavedStateProvider(
"base_delegate_tag"
) {
val outState = Bundle()
getDelegate()?.onSaveInstanceState(outState)
outState
}
addOnContextAvailableListener(OnContextAvailableListener {
val delegate = getDelegate()
delegate?.installViewFactory()
delegate?.onCreate(
savedStateRegistry
.consumeRestoredStateForKey("base_delegate_tag")
)
})
}
open fun getDelegate(): AppCompatDelegate? {
if (mDelegate == null) {
mDelegate = AppCompatDelegate.create(this, this)
}
return mDelegate
}
override fun onSupportActionModeStarted(mode: ActionMode?) {
}
override fun onSupportActionModeFinished(mode: ActionMode?) {
}
override fun onWindowStartingSupportActionMode(callback: ActionMode.Callback?): ActionMode? {
return null
}
}
希望对您有所帮助...
我有点纳闷。我在我的应用程序中使用 DayNight 主题(使用 AppCompatDelegate.setDefaultNightMode()
),但无法在我的 MainActivity
中使用它。
MainActivity
(扩展 FragmentActivity
)似乎从未设置为深色主题 - 它始终保持浅色主题。
我尝试直接在我的 MainActivity 中设置主题:
@Override
protected void onCreate(Bundle savedInstanceState) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
super.onCreate(savedInstanceState);
// create main activity.
}
但这不起作用。
我已经使用 ?attr/colorReference 正确设置了布局文件中的所有颜色。有人知道这里出了什么问题吗?
编辑: 我的styles.xml如下:
<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
<!--Default typeface and colors:-->
<item name="android:typeface">monospace</item>
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="colorAccentDarker">@color/colorAccentDarker</item>
<item name="colorAccentDarker_80percent">@color/colorAccentDarker_80percent</item>
<!--Show people's own wallpaper background-->
<item name="android:windowShowWallpaper">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
MainActivity
(which extendsFragmentActivity
)
FragmentActivity
不知道 AppCompat。 AppCompatDelegate
仅供 AppCompatActivity
使用,否则您必须 wire it manually 进行其他活动。
您可以扩展 AppCompatActivity
而不是 FragmentActivity
。
AppCompatActivity
比 FragmentActivity
有 3 个特色,即
1 通过 setSupportActionBar(Toolbar) 使用操作栏,包括操作项、导航模式等 API。
2 Built-in 通过使用 Theme.AppCompat.DayNight 主题和 AppCompatDelegate.setDefaultNightMode(int) API.[=35= 在明暗主题之间切换]
3 通过使用 getDrawerToggleDelegate() 与 DrawerLayout 集成 API.
并且我们需要 2nd 点来实现 activity 以 支持 自动切换主题。
这是Kotlin中的代码:
class MainActivity: FragmentActivity(), AppCompatCallback{
init{
initDelegate()
}
private var mDelegate: AppCompatDelegate? = null
override fun setTheme(@StyleRes resId: Int) {
super.setTheme(resId)
getDelegate()?.setTheme(resId)
}
fun initDelegate() {
savedStateRegistry.registerSavedStateProvider(
"base_delegate_tag"
) {
val outState = Bundle()
getDelegate()?.onSaveInstanceState(outState)
outState
}
addOnContextAvailableListener(OnContextAvailableListener {
val delegate = getDelegate()
delegate?.installViewFactory()
delegate?.onCreate(
savedStateRegistry
.consumeRestoredStateForKey("base_delegate_tag")
)
})
}
open fun getDelegate(): AppCompatDelegate? {
if (mDelegate == null) {
mDelegate = AppCompatDelegate.create(this, this)
}
return mDelegate
}
override fun onSupportActionModeStarted(mode: ActionMode?) {
}
override fun onSupportActionModeFinished(mode: ActionMode?) {
}
override fun onWindowStartingSupportActionMode(callback: ActionMode.Callback?): ActionMode? {
return null
}
}
希望对您有所帮助...