我想创建一个 flutter 应用程序,它有 2 个明暗模式主题,这些主题通过应用程序内的开关改变,默认主题是默认的 android 主题。
我需要将一些自定义颜色传递给其他小部件,我不想只配置材质主题。
我正在关注https://developer.android.com/jetpack/compose/tutorial
和代码
@Preview(name = "Light Mode")
@Preview(name = "Dark Mode", uiMode = Configuration.UI_MODE_NIGHT_UNDEFINED, showBackground = true)
@Preview(name = "Full Preview", showSystemUi = true)
@Composable
fun DefaultPreview() {
ComposeTutorialTheme {
MessageCard(Message("Roman", "message body"))
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试为我的 Android 应用程序支持 Android Q Dark 主题,但我无法弄清楚如何根据我当前所在的主题导入不同的资产。
我使用官方的 DayNight 主题来制作深色/浅色版本和可绘制对象,只需指向 XML 就很容易,它会根据启用的内容从 values 或 values-night 中选择正确的值。
我想做一些类似的事情,根据主题它会加载资产“priceTag_light.png”或“priceTag_dark.png”。
val inputStream = if(darkIsEnabled) {
assets.open("priceTag_dark.png")
} else {
assets.open("priceTag_light.png")
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让我得到那个标志?
当我启用深色模式时,我的应用程序上的某些菜单看起来很糟糕:非常暗的背景上的黑色文本。我对颜色完全是一个初学者。
我还没有接触过 android studio 上默认颜色设置的任何内容,所以我有默认的两个主题 XML 和 Color Xml:
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.TestSS" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
<style name="Theme.TestSS.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="Theme.TestSS.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="Theme.TestSS.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
</resources>
Run Code Online (Sandbox Code Playgroud)
和:
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. --> …
Run Code Online (Sandbox Code Playgroud) 我正在设计一个 Ionic 应用程序,无论用户是否启用了深色主题,我都希望它具有白色背景和黑色文本。
但是,当我在 Android 手机上启用深色主题时,它会自动转换为:
我想防止这种情况发生。我在网上搜索并找到了许多描述如何应用黑暗主题的文章,但我没有找到有关禁用它的任何信息。
我想到的一种解决方案是明确启用深色主题,然后为深色主题设置与浅色主题相同的颜色。但是,我认为这种方法可能是不可取的,因为它涉及编写大量冗余代码。
你能想到任何替代解决方案吗?
我们的应用程序依赖于让我们从和AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
中选取浅色和深色主题颜色values/colors
values-night/colors
但是每次我们尝试使用 时WebView
,它都会从重置 UiMode 开始,并且我们的应用程序会混淆为我们的主题选择哪些颜色值
有人遇到类似的问题吗?
我正在使用 jetpack compose 1.0.0,BottomSheetScaffold 工作正常,但是在我添加了一个功能来使用按钮将主题从浅色更改为深色后,在更改主题后,底部工作表将不会展开。我正在使用 Application 类的属性来处理主题状态。这是一些代码:
使用底部工作表的屏幕,顺便说一句,这是在片段上
MyAppTheme(application.isDark.value) {
val bottomSheetScaffoldState = rememberBottomSheetScaffoldState(
bottomSheetState = BottomSheetState(BottomSheetValue.Collapsed)
)
val coroutineScope = rememberCoroutineScope()
BottomSheetScaffold(
scaffoldState = bottomSheetScaffoldState,
sheetContent = {
HomeBottomSheet(
onCancelClick = {
coroutineScope.launch {
bottomSheetScaffoldState.bottomSheetState.collapse()
}
},
onDoneClick = { text ->
Toast.makeText(requireContext(), text, Toast.LENGTH_LONG)
.show()
}
)
},
sheetPeekHeight = 0.dp
) {
HomeScreen(
darkTheme = application.isDark.value,
darkThemeToggleClick = application::toggleDarkTheme,
onHistoryClick = {
findNavController().navigate(R.id.goToHistory)
},
onAddClick = {
coroutineScope.launch {
bottomSheetScaffoldState.bottomSheetState.expand()
}
}
)
}
}
Run Code Online (Sandbox Code Playgroud)
应用:
class …
Run Code Online (Sandbox Code Playgroud) android bottom-sheet android-jetpack-compose android-dark-theme
随着 Android 10 的发布,多个小部件(Gmail、Google 新闻、三星电子邮件)现在会在切换深色模式时更新其主题。我正在尝试复制这种行为。我有一个带有 AppWidgetProvider 和 RemoteViewsFactory 的列表视图小部件。但是,当切换深色模式时,ListView 项目会切换到深色主题,而不是布局本身:
深色模式关闭:
深色模式开启:
在我的代码中,我在 AppWidgetProvider 的 OnUpdate() 方法中设置布局:
override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager?,
appWidgetIds: IntArray?
) {
Log.d(TAG, "Updating Transaction Widget")
GlobalScope.launch(Dispatchers.IO ) {
updateTransactionTable(context)
for (i in appWidgetIds!!.indices) {
val layout: RemoteViews = buildLayout(context, appWidgetIds[i])
appWidgetManager!!.updateAppWidget(appWidgetIds[i], layout)
}
super.onUpdate(context, appWidgetManager, appWidgetIds)
}
}
Run Code Online (Sandbox Code Playgroud)
切换暗模式时不会调用 onUpdate。但是,当切换暗模式时,我似乎找不到在 AppWidgetProvider 中调用的任何方法,因此我不确定在哪里调用新的布局构建,甚至不知道如何检测何时需要更改。
任何帮助将非常感激。
我的新应用不支持深色模式。当我在小米上安装它时(打开深色模式)MIUI 会在其上应用深色模式。MIUI 在“设置 -> 显示 -> 更多深色模式选项”中进行设置(“更多深色模式选项”截图)。尽管我的应用程序不支持此选项,但我的应用程序已打开此选项并强制使用深色模式。大多数其他应用程序没有启用此模式。有些应用程序是“白色”的,但对于它们来说,此模式未启用并且它们可以正常工作。
我找到了通过将以下行添加到 theme.xml 的解决方案:
<item name="android:forceDarkAllowed">false</item>
Run Code Online (Sandbox Code Playgroud)
问题是,这一行需要设置 minSdkVersion = 29。如何防止 MIUI 在“更多深色模式选项”中启用该选项并在我的应用程序中强制使用深色模式(就像在大多数其他“白色”应用程序中一样)并将 SDK 版本保持在 21 ?
基于Android 10的MIUI 12