从0到1打造一款安卓app之9-通过style定义一些通用样式
定义AppTheme并应用于全局样式 AndroidManifest.xml 里的 application
<application
android:name=".MainApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
/>
<style name="AppTheme" parent="Theme.Material3.DayNight.NoActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/white</item>
<item name="colorPrimaryVariant">@color/white</item>
<item name="colorOnPrimary">@color/main_black</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">@color/main_background</item>
<!-- Customize your theme here. -->
<item name="android:windowNoTitle">true</item>
<item name="android:windowActionBar">true</item>
<item name="materialButtonStyle">@style/widgetMaterial3ButtonStyle</item>
</style>
按住Ctrl+鼠标点击parent后的引用,可以找到最终的样式配置。
Theme.Material3.DayNight.NoActionBar 内置的主题样式默认配置为
<style name="Base.V14.Theme.Material3.Light" parent="Theme.MaterialComponents.Light">
<item name="isMaterial3Theme">true</item>
<!-- Color palettes -->
<item name="colorPrimary">@color/m3_sys_color_light_primary</item>
<item name="colorPrimaryDark">?attr/colorPrimary</item>
<item name="colorOnPrimary">@color/m3_sys_color_light_on_primary</item>
<item name="colorPrimaryInverse">@color/m3_sys_color_light_inverse_primary</item>
<item name="colorPrimaryContainer">@color/m3_sys_color_light_primary_container</item>
<item name="colorOnPrimaryContainer">@color/m3_sys_color_light_on_primary_container</item>
<item name="colorSecondary">@color/m3_sys_color_light_secondary</item>
<item name="colorOnSecondary">@color/m3_sys_color_light_on_secondary</item>
<item name="colorSecondaryContainer">@color/m3_sys_color_light_secondary_container</item>
<item name="colorOnSecondaryContainer">@color/m3_sys_color_light_on_secondary_container</item>
<item name="colorTertiary">@color/m3_sys_color_light_tertiary</item>
<item name="colorOnTertiary">@color/m3_sys_color_light_on_tertiary</item>
<item name="colorTertiaryContainer">@color/m3_sys_color_light_tertiary_container</item>
<item name="colorOnTertiaryContainer">@color/m3_sys_color_light_on_tertiary_container</item>
<item name="android:colorBackground">@color/m3_sys_color_light_background</item>
<item name="colorOnBackground">@color/m3_sys_color_light_on_background</item>
<item name="colorSurface">@color/m3_sys_color_light_surface</item>
<item name="colorOnSurface">@color/m3_sys_color_light_on_surface</item>
<item name="colorSurfaceVariant">@color/m3_sys_color_light_surface_variant</item>
<item name="colorOnSurfaceVariant">@color/m3_sys_color_light_on_surface_variant</item>
<item name="colorSurfaceInverse">@color/m3_sys_color_light_inverse_surface</item>
<item name="colorOnSurfaceInverse">@color/m3_sys_color_light_inverse_on_surface</item>
<item name="colorOutline">@color/m3_sys_color_light_outline</item>
<item name="colorError">@color/m3_sys_color_light_error</item>
<item name="colorOnError">@color/m3_sys_color_light_on_error</item>
<item name="colorErrorContainer">@color/m3_sys_color_light_error_container</item>
<item name="colorOnErrorContainer">@color/m3_sys_color_light_on_error_container</item>
<!-- Default Framework Text Colors. -->
<item name="android:textColorPrimary">@color/m3_default_color_primary_text</item>
<item name="android:textColorPrimaryInverse">@color/m3_dark_default_color_primary_text</item>
<item name="android:textColorSecondary">@color/m3_default_color_secondary_text</item>
<item name="android:textColorSecondaryInverse">@color/m3_dark_default_color_secondary_text</item>
<item name="android:textColorTertiary">@color/m3_default_color_secondary_text</item>
<item name="android:textColorTertiaryInverse">@color/m3_dark_default_color_secondary_text</item>
<item name="android:textColorPrimaryDisableOnly">@color/m3_primary_text_disable_only</item>
<item name="android:textColorPrimaryInverseDisableOnly">@color/m3_dark_primary_text_disable_only</item>
<item name="android:textColorHint">@color/m3_hint_foreground</item>
<item name="android:textColorHintInverse">@color/m3_dark_hint_foreground</item>
<item name="android:textColorHighlight">@color/m3_highlighted_text</item>
<item name="android:textColorHighlightInverse">@color/m3_dark_highlighted_text</item>
<item name="android:textColorLink">?attr/colorPrimary</item>
<item name="android:textColorLinkInverse">?attr/colorPrimaryInverse</item>
<item name="android:textColorAlertDialogListItem">@color/m3_default_color_primary_text</item>
<!-- Dialog themes. -->
<item name="alertDialogTheme">@style/ThemeOverlay.Material3.Dialog.Alert</item>
<item name="bottomSheetDialogTheme">@style/ThemeOverlay.Material3.BottomSheetDialog</item>
<item name="materialAlertDialogTheme">@style/ThemeOverlay.Material3.MaterialAlertDialog</item>
<!-- Picker styles and themes. -->
<item name="materialCalendarStyle">@style/Widget.Material3.MaterialCalendar</item>
<item name="materialCalendarFullscreenTheme">@style/ThemeOverlay.Material3.MaterialCalendar.Fullscreen</item>
<item name="materialCalendarTheme">@style/ThemeOverlay.Material3.MaterialCalendar</item>
<item name="materialTimePickerTheme">@style/ThemeOverlay.Material3.MaterialTimePicker</item>
<!-- Widget styles. -->
<item name="actionBarStyle">@style/Widget.Material3.Light.ActionBar.Solid</item>
<item name="actionModeStyle">@style/Widget.Material3.ActionMode</item>
<item name="appBarLayoutStyle">@style/Widget.Material3.AppBarLayout</item>
<item name="badgeStyle">@style/Widget.Material3.Badge</item>
<item name="borderlessButtonStyle">@style/Widget.Material3.Button.TextButton</item>
<item name="bottomAppBarStyle">@style/Widget.Material3.BottomAppBar</item>
<item name="bottomNavigationStyle">@style/Widget.Material3.BottomNavigationView</item>
<item name="buttonBarButtonStyle">@style/Widget.Material3.Button.TextButton.Dialog</item>
<item name="checkboxStyle">@style/Widget.Material3.CompoundButton.CheckBox</item>
<item name="chipStyle">@style/Widget.Material3.Chip.Assist</item>
<item name="chipGroupStyle">@style/Widget.Material3.ChipGroup</item>
<item name="chipStandaloneStyle">@style/Widget.Material3.Chip.Input</item>
<item name="circularProgressIndicatorStyle">@style/Widget.Material3.CircularProgressIndicator</item>
<item name="collapsingToolbarLayoutStyle">@style/Widget.Material3.CollapsingToolbar</item>
<item name="collapsingToolbarLayoutMediumStyle">@style/Widget.Material3.CollapsingToolbar.Medium</item>
<item name="collapsingToolbarLayoutLargeStyle">@style/Widget.Material3.CollapsingToolbar.Large</item>
<item name="drawerLayoutStyle">@style/Widget.Material3.DrawerLayout</item>
<item name="extendedFloatingActionButtonStyle">?attr/extendedFloatingActionButtonPrimaryStyle</item>
<item name="extendedFloatingActionButtonPrimaryStyle">@style/Widget.Material3.ExtendedFloatingActionButton.Icon.Primary</item>
<item name="extendedFloatingActionButtonSecondaryStyle">@style/Widget.Material3.ExtendedFloatingActionButton.Icon.Secondary</item>
<item name="extendedFloatingActionButtonTertiaryStyle">@style/Widget.Material3.ExtendedFloatingActionButton.Icon.Tertiary</item>
<item name="extendedFloatingActionButtonSurfaceStyle">@style/Widget.Material3.ExtendedFloatingActionButton.Icon.Surface</item>
<item name="floatingActionButtonStyle">?attr/floatingActionButtonPrimaryStyle</item>
<item name="floatingActionButtonPrimaryStyle">@style/Widget.Material3.FloatingActionButton.Primary</item>
<item name="floatingActionButtonSecondaryStyle">@style/Widget.Material3.FloatingActionButton.Secondary</item>
<item name="floatingActionButtonTertiaryStyle">@style/Widget.Material3.FloatingActionButton.Tertiary</item>
<item name="floatingActionButtonSurfaceStyle">@style/Widget.Material3.FloatingActionButton.Surface</item>
<item name="floatingActionButtonLargeStyle">?attr/floatingActionButtonLargePrimaryStyle</item>
<item name="floatingActionButtonLargePrimaryStyle">@style/Widget.Material3.FloatingActionButton.Large.Primary</item>
<item name="floatingActionButtonLargeSecondaryStyle">@style/Widget.Material3.FloatingActionButton.Large.Secondary</item>
<item name="floatingActionButtonLargeTertiaryStyle">@style/Widget.Material3.FloatingActionButton.Large.Tertiary</item>
<item name="floatingActionButtonLargeSurfaceStyle">@style/Widget.Material3.FloatingActionButton.Large.Surface</item>
<item name="linearProgressIndicatorStyle">@style/Widget.Material3.LinearProgressIndicator</item>
<item name="materialButtonOutlinedStyle">@style/Widget.Material3.Button.OutlinedButton</item>
<item name="materialButtonStyle">@style/Widget.Material3.Button</item>
<item name="materialCardViewStyle">?attr/materialCardViewOutlinedStyle</item>
<item name="materialCardViewOutlinedStyle">@style/Widget.Material3.CardView.Outlined</item>
<item name="materialCardViewFilledStyle">@style/Widget.Material3.CardView.Filled</item>
<item name="materialCardViewElevatedStyle">@style/Widget.Material3.CardView.Elevated</item>
<item name="navigationRailStyle">@style/Widget.Material3.NavigationRailView</item>
<item name="navigationViewStyle">@style/Widget.Material3.NavigationView</item>
<item name="radioButtonStyle">@style/Widget.Material3.CompoundButton.RadioButton</item>
<item name="sliderStyle">@style/Widget.Material3.Slider</item>
<item name="snackbarStyle">@style/Widget.Material3.Snackbar</item>
<item name="snackbarButtonStyle">@style/Widget.Material3.Button.TextButton.Snackbar</item>
<item name="snackbarTextViewStyle">@style/Widget.Material3.Snackbar.TextView</item>
<item name="switchStyle">@style/Widget.Material3.CompoundButton.Switch</item>
<item name="tabStyle">@style/Widget.Material3.TabLayout</item>
<item name="tabSecondaryStyle">@style/Widget.Material3.TabLayout.Secondary</item>
<item name="textInputStyle">?attr/textInputOutlinedStyle</item>
<item name="textInputOutlinedStyle">@style/Widget.Material3.TextInputLayout.OutlinedBox</item>
<item name="textInputFilledStyle">@style/Widget.Material3.TextInputLayout.FilledBox</item>
<item name="textInputOutlinedDenseStyle">@style/Widget.Material3.TextInputLayout.OutlinedBox.Dense</item>
<item name="textInputFilledDenseStyle">@style/Widget.Material3.TextInputLayout.FilledBox.Dense</item>
<item name="textInputOutlinedExposedDropdownMenuStyle">@style/Widget.Material3.TextInputLayout.OutlinedBox.ExposedDropdownMenu</item>
<item name="textInputFilledExposedDropdownMenuStyle">@style/Widget.Material3.TextInputLayout.FilledBox.ExposedDropdownMenu</item>
<item name="toolbarStyle">@style/Widget.Material3.Toolbar</item>
<item name="toolbarSurfaceStyle">@style/Widget.Material3.Toolbar.Surface</item>
<!-- Top App Bars. -->
<item name="actionBarSize">@dimen/m3_appbar_size_compact</item>
<item name="collapsingToolbarLayoutMediumSize">@dimen/m3_appbar_size_medium</item>
<item name="collapsingToolbarLayoutLargeSize">@dimen/m3_appbar_size_large</item>
<!-- Popup Menu styles. -->
<item name="popupMenuBackground">@drawable/m3_popupmenu_background_overlay</item>
<item name="listPopupWindowStyle">@style/Widget.Material3.PopupMenu.ListPopupWindow</item>
<item name="popupMenuStyle">@style/Widget.Material3.PopupMenu</item>
<item name="actionOverflowMenuStyle">@style/Widget.Material3.PopupMenu.Overflow</item>
<!-- Divider styles. -->
<item name="materialDividerStyle">@style/Widget.Material3.MaterialDivider</item>
<item name="materialDividerHeavyStyle">@style/Widget.Material3.MaterialDivider.Heavy</item>
<!-- Type styles. -->
<item name="textAppearanceDisplayLarge">@style/TextAppearance.Material3.DisplayLarge</item>
<item name="textAppearanceDisplayMedium">@style/TextAppearance.Material3.DisplayMedium</item>
<item name="textAppearanceDisplaySmall">@style/TextAppearance.Material3.DisplaySmall</item>
<item name="textAppearanceHeadlineLarge">@style/TextAppearance.Material3.HeadlineLarge</item>
<item name="textAppearanceHeadlineMedium">@style/TextAppearance.Material3.HeadlineMedium</item>
<item name="textAppearanceHeadlineSmall">@style/TextAppearance.Material3.HeadlineSmall</item>
<item name="textAppearanceTitleLarge">@style/TextAppearance.Material3.TitleLarge</item>
<item name="textAppearanceTitleMedium">@style/TextAppearance.Material3.TitleMedium</item>
<item name="textAppearanceTitleSmall">@style/TextAppearance.Material3.TitleSmall</item>
<item name="textAppearanceBodyLarge">@style/TextAppearance.Material3.BodyLarge</item>
<item name="textAppearanceBodyMedium">@style/TextAppearance.Material3.BodyMedium</item>
<item name="textAppearanceBodySmall">@style/TextAppearance.Material3.BodySmall</item>
<item name="textAppearanceLabelLarge">@style/TextAppearance.Material3.LabelLarge</item>
<item name="textAppearanceLabelMedium">@style/TextAppearance.Material3.LabelMedium</item>
<item name="textAppearanceLabelSmall">@style/TextAppearance.Material3.LabelSmall</item>
<!-- Default Framework Text styles. -->
<item name="android:textAppearanceListItem">?attr/textAppearanceTitleMedium</item>
<item name="android:textAppearanceListItemSmall">?attr/textAppearanceTitleMedium</item>
<item name="android:textAppearanceListItemSecondary" ns1:targetApi="21">?attr/textAppearanceBodyMedium</item>
<item name="textAppearanceListItem">?attr/textAppearanceTitleMedium</item>
<item name="textAppearanceListItemSmall">?attr/textAppearanceTitleMedium</item>
<item name="textAppearanceListItemSecondary">?attr/textAppearanceBodyMedium</item>
<!-- Menu type styles. -->
<item name="textAppearanceLargePopupMenu">?attr/textAppearanceBodyLarge</item>
<item name="textAppearanceSmallPopupMenu">?attr/textAppearanceBodyLarge</item>
<!-- TODO: Populate font families here -->
<!-- Shape styles. -->
<item name="shapeAppearanceSmallComponent">@style/ShapeAppearance.Material3.SmallComponent</item>
<item name="shapeAppearanceMediumComponent">@style/ShapeAppearance.Material3.MediumComponent</item>
<item name="shapeAppearanceLargeComponent">@style/ShapeAppearance.Material3.LargeComponent</item>
<!-- Motion-->
<item name="motionEasingStandard">@string/m3_sys_motion_easing_standard</item>
<item name="motionEasingEmphasized">@string/m3_sys_motion_easing_emphasized</item>
<item name="motionEasingDecelerated">@string/m3_sys_motion_easing_decelerated</item>
<item name="motionEasingAccelerated">@string/m3_sys_motion_easing_accelerated</item>
<item name="motionEasingLinear">@string/m3_sys_motion_easing_linear</item>
<item name="motionDurationShort1">@integer/m3_sys_motion_duration_short1</item>
<item name="motionDurationShort2">@integer/m3_sys_motion_duration_short2</item>
<item name="motionDurationMedium1">@integer/m3_sys_motion_duration_medium1</item>
<item name="motionDurationMedium2">@integer/m3_sys_motion_duration_medium2</item>
<item name="motionDurationLong1">@integer/m3_sys_motion_duration_long1</item>
<item name="motionDurationLong2">@integer/m3_sys_motion_duration_long2</item>
<item name="motionPath">@integer/m3_sys_motion_path</item>
<!-- Elevation overlays. -->
<item name="elevationOverlayEnabled">true</item>
<item name="elevationOverlayColor">?attr/colorPrimary</item>
<!-- Theme overlays. -->
<item name="dynamicColorThemeOverlay">@style/ThemeOverlay.Material3.DynamicColors.Light</item>
</style>
继承并自定义一些样式属性
如果想要修改一些控件的默认样式,在自定义的地方覆盖即可,
例如,想要修改button的默认背景色,
1.继承并自定义某个控件的默认样式,然后修改需要覆盖的属性,如backgroundTint是覆盖并重新指定背景色
<style name="widgetMaterial3ButtonStyle" parent="@style/Widget.Material3.Button">
<item name="backgroundTint">@color/buttonTint</item>
</style>
2.把样式放到全局样式下引用 <item name="materialButtonStyle">@style/widgetMaterial3ButtonStyle</item>
这样整个app的按钮默认的颜色就是这一个了
<style name="AppTheme" parent="Theme.Material3.DayNight.NoActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/white</item>
<item name="colorPrimaryVariant">@color/white</item>
<item name="colorOnPrimary">@color/main_black</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">@color/main_background</item>
<!-- Customize your theme here. -->
<item name="android:windowNoTitle">true</item>
<item name="android:windowActionBar">true</item>
<item name="android:background">@color/main_background</item>
<item name="materialButtonStyle">@style/widgetMaterial3ButtonStyle</item>
</style>
设置添加view的水波纹点击效果
<style name="defaultSelectableItemBackground" parent="@style/Widget.Material3.Button">
<item name="android:foreground">?android:attr/selectableItemBackground</item>
</style>
设置全局背景色
<item name="android:colorBackground">@color/main_background</item>
所有的颜色属性可以在这里找到