在 styles.xml 中的 *all* 主题样式中添加 child 以避免重复代码
Adding a child to *all* theme styles in styles.xml to avoid duplicate code
我想删除 styles.xml 中的大量重复条目,只是因为一遍又一遍地重复相同的代码很烦人。假设我有一个主题:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="color_1">#000000</item>
<item name="color_2">#424242</item>
<item name="myMinTextSize">14sp</item>
<item name="myNormalTextSize">18sp</item>
<item name="myMaxTextSize">22sp</item>
<!-- lots of other stuff -->
</style>
这些是 attr.xml 中的尺寸属性:
<attr name="myMinTextSize" format="dimension" />
<attr name="myNormalTextSize" format="dimension" />
<attr name="myMaxTextSize" format="dimension" />
现在我有一些主题 children 会像这样改变颜色:
<style name="AppTheme.1">
<item name="color_1">#131313</item>
<item name="color_2">#BBBBBB</item>
</style>
我也希望能够更改文本大小,但为此我必须为每个主题制作一个 child,如下所示:
<style name="AppTheme.Small">
<item name="myMinTextSize">12sp</item>
<item name="myNormalTextSize">14sp</item>
<item name="myMaxTextSize">16sp</item>
</style>
<style name="AppTheme.1.Small">
<item name="myMinTextSize">12sp</item>
<item name="myNormalTextSize">14sp</item>
<item name="myMaxTextSize">16sp</item>
</style>
<!-- and all the other theme children with .Small suffix will have *the exact same thing* -->
我有很多 children 的颜色和很多 children 的 children 的文字大小。 我希望能够做的(无需以编程方式进行)是不要在 styles.xml 文件中一遍又一遍地重复同样的事情。有办法吗? 例如:
<style name="*.Small">
<item name="myMinTextSize">12sp</item>
<item name="myNormalTextSize">16sp</item>
<item name="myMaxTextSize">20sp</item>
</style>
<style name="*.Large">
<item name="myMinTextSize">16sp</item>
<item name="myNormalTextSize">20sp</item>
<item name="myMaxTextSize">24sp</item>
</style>
我根据用户这样选择的选项在程序中选择主题,然后将它们应用到活动中(我确信变量名称足够明显,足以让我的观点得到理解):
mThemeResId = when (mCurrentTheme) {
THEME_0 -> when (mCurrentFontSize) {
SMALL -> R.style.AppTheme_Small
LARGE -> R.style.AppTheme_Large
else -> R.style.AppTheme
}
THEME_1 -> when (mCurrentFontSize) {
SMALL -> R.style.AppTheme_1_Small
LARGE -> R.style.AppTheme_1_Large
else -> R.style.AppTheme_1
}
// and lots of others
}
你可以做一些不同的事情。
您可以将它们定义为主题叠加层,而不是定义不同的应用主题。
类似于:
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="color_1">#000000</item>
<item name="color_2">#424242</item>
<item name="myMinTextSize">14sp</item>
<item name="myNormalTextSize">18sp</item>
<item name="myMaxTextSize">22sp</item>
</style>
<style name="ThemeOverlay.Color.Red" parent="">
<item name="colorPrimary">@color/red600</item>
<item name="color_1">@color/red600Light</item>
<item name="color_2">@color/red600Dard</item>
</style>
<style name="ThemeOverlay.Color.Green" parent="">
<item name="colorPrimary">@color/green500</item>
<item name="color_1">@color/green500Light</item>
<item name="color_2">@color/green500Dard</item>
</style>
<style name="ThemeOverlay.Text.Small" parent="">
<item name="myMinTextSize">12sp</item>
<item name="myNormalTextSize">16sp</item>
<item name="myMaxTextSize">20sp</item>
</style>
<style name="ThemeOverlay.Text.Medieum" parent="">
<item name="myMinTextSize">16sp</item>
<item name="myNormalTextSize">20sp</item>
<item name="myMaxTextSize">24sp</item>
</style>
然后您的 Activity 默认使用 AppTheme
只需应用 all 您需要的主题覆盖。
例如:
override fun onCreate(savedInstanceState: Bundle?) {
setTheme(R.style.ThemeOverlay_Color_Red)
setTheme(R.style.ThemeOverlay_Text_Small)
super.onCreate(savedInstanceState)
//..
}
我想删除 styles.xml 中的大量重复条目,只是因为一遍又一遍地重复相同的代码很烦人。假设我有一个主题:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="color_1">#000000</item>
<item name="color_2">#424242</item>
<item name="myMinTextSize">14sp</item>
<item name="myNormalTextSize">18sp</item>
<item name="myMaxTextSize">22sp</item>
<!-- lots of other stuff -->
</style>
这些是 attr.xml 中的尺寸属性:
<attr name="myMinTextSize" format="dimension" />
<attr name="myNormalTextSize" format="dimension" />
<attr name="myMaxTextSize" format="dimension" />
现在我有一些主题 children 会像这样改变颜色:
<style name="AppTheme.1">
<item name="color_1">#131313</item>
<item name="color_2">#BBBBBB</item>
</style>
我也希望能够更改文本大小,但为此我必须为每个主题制作一个 child,如下所示:
<style name="AppTheme.Small">
<item name="myMinTextSize">12sp</item>
<item name="myNormalTextSize">14sp</item>
<item name="myMaxTextSize">16sp</item>
</style>
<style name="AppTheme.1.Small">
<item name="myMinTextSize">12sp</item>
<item name="myNormalTextSize">14sp</item>
<item name="myMaxTextSize">16sp</item>
</style>
<!-- and all the other theme children with .Small suffix will have *the exact same thing* -->
我有很多 children 的颜色和很多 children 的 children 的文字大小。 我希望能够做的(无需以编程方式进行)是不要在 styles.xml 文件中一遍又一遍地重复同样的事情。有办法吗? 例如:
<style name="*.Small">
<item name="myMinTextSize">12sp</item>
<item name="myNormalTextSize">16sp</item>
<item name="myMaxTextSize">20sp</item>
</style>
<style name="*.Large">
<item name="myMinTextSize">16sp</item>
<item name="myNormalTextSize">20sp</item>
<item name="myMaxTextSize">24sp</item>
</style>
我根据用户这样选择的选项在程序中选择主题,然后将它们应用到活动中(我确信变量名称足够明显,足以让我的观点得到理解):
mThemeResId = when (mCurrentTheme) {
THEME_0 -> when (mCurrentFontSize) {
SMALL -> R.style.AppTheme_Small
LARGE -> R.style.AppTheme_Large
else -> R.style.AppTheme
}
THEME_1 -> when (mCurrentFontSize) {
SMALL -> R.style.AppTheme_1_Small
LARGE -> R.style.AppTheme_1_Large
else -> R.style.AppTheme_1
}
// and lots of others
}
你可以做一些不同的事情。
您可以将它们定义为主题叠加层,而不是定义不同的应用主题。
类似于:
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="color_1">#000000</item>
<item name="color_2">#424242</item>
<item name="myMinTextSize">14sp</item>
<item name="myNormalTextSize">18sp</item>
<item name="myMaxTextSize">22sp</item>
</style>
<style name="ThemeOverlay.Color.Red" parent="">
<item name="colorPrimary">@color/red600</item>
<item name="color_1">@color/red600Light</item>
<item name="color_2">@color/red600Dard</item>
</style>
<style name="ThemeOverlay.Color.Green" parent="">
<item name="colorPrimary">@color/green500</item>
<item name="color_1">@color/green500Light</item>
<item name="color_2">@color/green500Dard</item>
</style>
<style name="ThemeOverlay.Text.Small" parent="">
<item name="myMinTextSize">12sp</item>
<item name="myNormalTextSize">16sp</item>
<item name="myMaxTextSize">20sp</item>
</style>
<style name="ThemeOverlay.Text.Medieum" parent="">
<item name="myMinTextSize">16sp</item>
<item name="myNormalTextSize">20sp</item>
<item name="myMaxTextSize">24sp</item>
</style>
然后您的 Activity 默认使用 AppTheme
只需应用 all 您需要的主题覆盖。
例如:
override fun onCreate(savedInstanceState: Bundle?) {
setTheme(R.style.ThemeOverlay_Color_Red)
setTheme(R.style.ThemeOverlay_Text_Small)
super.onCreate(savedInstanceState)
//..
}