Android 将子项添加到styles.xml中的*all*主题样式以避免重复代码

Android 将子项添加到styles.xml中的*all*主题样式以避免重复代码,android,android-theme,android-styles,android-attributes,Android,Android Theme,Android Styles,Android Attributes,我想删除styles.xml中的大量重复条目,只是因为一遍又一遍地重复相同的代码很烦人。假设我有一个主题: <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="color_1">#000000</item> <item name="color_2">

我想删除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>

你可以做一些不同的事情

您可以将它们定义为主题覆盖,而不是定义不同的应用程序主题,将它们划分为类别

比如:

<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>

谢谢我不知道主题覆盖。这正是我需要的。
<style name="AppTheme.1">
    <item name="color_1">#131313</item>
    <item name="color_2">#BBBBBB</item>
</style>
<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* -->
<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>
override fun onCreate(savedInstanceState: Bundle?) {
    setTheme(R.style.ThemeOverlay_Color_Red)
    setTheme(R.style.ThemeOverlay_Text_Small)
    super.onCreate(savedInstanceState)
    //..
}