我正在使用 Theme.Material.Components.DayNight 主题在我的应用程序中实现暗模式。问题是我的暗模式将纯粹与暗成分混合,而我的“亮”模式将与混合的暗和亮成分混合。因此,当应用程序默认模式设置为 Light 时,我需要以某种方式访问深色主题属性。你能帮我解决我的问题吗?
我正在考虑设置自定义主题“DarkThemeInLight”并将其分配给应该是黑暗的视图,但这是一个好方法吗?如果我直接在该主题定义中设置颜色,我将重复 color.xml(night) 中几乎一半的代码。
我正在考虑的方法:
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorSecondary">@color/colorSecondary</item>
<item name="android:colorBackground">@color/colorBackground</item>
<item name="colorSurface">@color/colorSurface</item>
<item name="colorError">@color/colorOnError</item>
<item name="colorOnPrimary">@color/colorOnPrimary</item>
<item name="colorOnSecondary">@color/colorOnSecondary</item>
<item name="colorOnBackground">@color/colorOnBackground</item>
<item name="colorOnSurface">@color/colorOnSurface</item>
<item name="colorOnError">@color/colorOnError</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="drawerArrowStyle">@style/DrawerIcon</item>
<item name="textAppearanceSubtitle1">@style/TextAppearance.MyTheme.Subtitle1</item>
<item name="textAppearanceSubtitle2">@style/TextAppearance.MyTheme.Subtitle2</item>
<item name="textAppearanceCaption">@style/TextAppearance.MyTheme.Caption</item>
<item name="android:colorControlActivated">@color/colorPrimary</item>
</style>
<style name="DarkThemeInLight" parent="AppTheme">
<item name="android:colorBackground">@night/colorsBackground</item> (Can i call night folder somehow?)
or
<item name="android:colorBackground">#121212</item> (Value from night colors folder)
...
</style>
Run Code Online (Sandbox Code Playgroud)
2020 年 6 月 4 日更新:
最终,我能够达到我提到的效果。由于两个独立的 AppTheme 和 AppTheme.Dark 样式的定义,我能够将某些组件样式化为浅色,而将其他组件样式化为深色,但我的解决方案排除了在浅色和深色模式之间切换的可能性,因此我的问题仍然存在
<style …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现如下所示的行为(在图片上),因此我需要拉伸 AppBarLayout 下面的所有内容。我已经通过实现自定义 CoordinatorLayout 行为以某种方式实现了这一目标,但该解决方案在 RecyclerView 内的视图回收和整体性能方面存在一些问题。有没有更简单的解决方案来实现我想要的?
public class TestBehaviour48Margin extends CoordinatorLayout.Behavior {
public TestBehaviour48Margin() {
}
public TestBehaviour48Margin(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean layoutDependsOn(@NonNull CoordinatorLayout parent, @NonNull View child, @NonNull View dependency) {
return dependency instanceof AppBarLayout;
}
@Override
public boolean onDependentViewChanged(@NonNull CoordinatorLayout parent, @NonNull View child, @NonNull View dependency) {
AppBarLayout appBarLayout = (AppBarLayout) dependency;
val toolbar = appBarLayout.findViewById(R.id.toolbar);
int range = appBarLayout.getTotalScrollRange();
int totalHeight = parent.getHeight();
int appBarHeight = appBarLayout.getHeight();
int toolbarHeight …Run Code Online (Sandbox Code Playgroud)