- Android styling: common theme attributes
- Android Styling: Themes vs Styles
- The Android styling system offers a powerful way to specify your app’s visual design, but it can be easy to misuse…
- Colors
- Dimens
- Drawables
- TextAppearances
- Shape
- Button Styles
- Floats
- App vs Android namespace
- More Resources
- Do It Yourself
- Question (mark) everything
- New to android need to understand «?android:attr/actionBarSize»
- 3 Answers 3
- Not the answer you’re looking for? Browse other questions tagged java android or ask your own question.
- Linked
- Related
- Hot Network Questions
- Subscribe to RSS
- What does ?attr/ mean on Android?
- 2 Answers 2
- Can someone explain the attr?
- 6 Answers 6
Android styling: common theme attributes
In the previous article in this series on Android styling, we looked at the difference between themes and styles and how themes allow you to write more flexible styles and layouts which isolate changes:
Android Styling: Themes vs Styles
The Android styling system offers a powerful way to specify your app’s visual design, but it can be easy to misuse…
Specifically we recommended using theme attributes to provide a point of indirection to resources, so that you can vary them (e.g. in dark theme). That is, if you find yourself writing a direct resource reference (or worse yet, a hardcoded value 😱) in a layout or style, consider if you should use a theme attribute instead.
But what theme attributes are available to use? This post highlights the common ones that you should know about; those that come from Material, AppCompat or the platform. This is not a complete list (for that I’d recommend browsing the attrs files linked below where they are defined) but these are the attributes that I use all the time.
Colors
Many of these colors come from the Material color system, which defines semantic names for colors that you can use throughout your app (implemented as theme attrs).
- ?attr/colorPrimary The primary branding color for the app.
- ?attr/colorSecondary The secondary branding color for the app, usually a bright complement to the primary branding color.
- ?attr/colorOn[Primary, Secondary, Surface etc] A color which contrasts against the named color.
- ?attr/color[Primary, Secondary]Variant An alternate shade of the given color.
- ?attr/colorSurface A color for surfaces of components, such as cards, sheets, and menus.
- ?android:attr/colorBackground The background for the screen.
- ?attr/colorPrimarySurface switches between colorPrimary in the Light themes, colorSurface in the Dark theme.
- ?attr/colorError A color for displaying errors.
Other handy colors:
- ?attr/colorControlNormal The color applied to icons/controls in their normal state.
- ?attr/colorControlActivated The color applied to icons/controls in their activated state (e.g. checked).
- ?attr/colorControlHighlight The color applied to control highlights (e.g. ripples, list selectors).
- ?android:attr/textColorPrimary The most prominent text color.
- ?android:attr/textColorSecondary Secondary text color.
Dimens
- ?attr/listPreferredItemHeight Standard (min) height for list items.
- ?attr/actionBarSize The height of a toolbar.
Drawables
- ?attr/selectableItemBackground A ripple/highlight for interactive items (also handy for foregrounds!!)
- ?attr/selectableItemBackgroundBorderless An unbounded ripple.
- ?attr/dividerVertical A drawable that may be used as a vertical divider between visual elements.
- ?attr/dividerHorizontal A drawable that may be used as a horizontal divider between visual elements.
TextAppearances
Material defines a type scale — a discrete set of text styles that you should use throughout your app, each of which is provided as a theme attribute which can be set as a textAppearance . Check out the Material type scale generator to help generate a scale for different fonts.
- ?attr/textAppearanceHeadline1 defaults to light 96sp text.
- ?attr/textAppearanceHeadline2 defaults to light 60sp text.
- ?attr/textAppearanceHeadline3 defaults to regular 48sp text.
- ?attr/textAppearanceHeadline4 defaults to regular 34sp text.
- ?attr/textAppearanceHeadline5 defaults to regular 24sp text.
- ?attr/textAppearanceHeadline6 defaults to medium 20sp text.
- ?attr/textAppearanceSubtitle1 defaults to regular 16sp text.
- ?attr/textAppearanceSubtitle2 defaults to medium 14sp text.
- ?attr/textAppearanceBody1 defaults to regular 16sp text.
- ?attr/textAppearanceBody2 defaults to regular 14sp text.
- ?attr/textAppearanceCaption defaults to regular 12sp text.
- ?attr/textAppearanceButton defaults to medium all caps 14sp text.
- ?attr/textAppearanceOverline defaults to regular all caps 10sp text.
Shape
Material employs a shape system which is implemented as theme attrs for small, medium and large components. Note that if you’re setting a shape appearance on a custom component, you likely want to use a MaterialShapeDrawable as it’s background which understands and implements the shaping.
- ?attr/shapeAppearanceSmallComponent used for Buttons, Chips, Text Fields etc. Defaults to rounded 4dp corners.
- ?attr/shapeAppearanceMediumComponent used for Cards, Dialogs, Date Pickers etc. Defaults to rounded 4dp corners.
- ?attr/shapeAppearanceLargeComponent used for Bottom Sheets etc. Defaults to rounded 0dp corners (i.e. square!)
Button Styles
This might seem super specific, but Material defines three types of buttons: Contained, Text and Outlined. MDC offers theme attrs that you can use to set the style of a MaterialButton :
- ?attr/materialButtonStyle defaults to contained (or just omit the style).
- ?attr/borderlessButtonStyle for a text style button.
- ?attr/materialButtonOutlinedStyle for outlined style.
Floats
- ?android:attr/disabledAlpha Default disabled alpha for widgets.
- ?android:attr/primaryContentAlpha The alpha applied to the foreground elements.
- ?android:attr/secondaryContentAlpha The alpha applied to secondary elements.
App vs Android namespace
You might have noticed that some attributes are referenced by
? android:attr/foo and others just by ?attr/bar . This is because some are defined by the Android platform, and as such you need the android part to reference them by their namespace (just like with view attributes in layouts: android:id ). Those without come from static libraries (i.e. AppCompat or MDC) which are compiled into your application, so don’t need the namespace (similar to how you might use app:baz in a layout). Some elements are defined both in the platform and in a library e.g. colorPrimary . In these cases, prefer the non-platform version, as this can be used on all API levels i.e. they’re duplicated in a library precisely to backport them. In these cases, I’ve listed the non-platform versions above.
prefer non-platform attributes which can be used on all API levels
More Resources
For a complete list of the theme attributes available to use, go to the source of truth:
Material Design Components:
Do It Yourself
Sometimes there isn’t a theme attribute which abstracts something you’d like to vary by theme. No worries… create your own! Here’s an example from the Google I/O app which shows a list of conference sessions in two screens.
They’re largely similar but the left screen must leave space for the sticky time headers while the right screen does not. We implemented this by abstracting where to align items behind a theme attribute so that we can vary them by theme and use the same layout across two different screens:
1. Define the theme attribute in attrs.xml
2. Provide different values in different themes:
3. Use the theme attr in the single layout used on both screens (each using one of the above themes):
Question (mark) everything
Knowing what theme attributes are available, equips you to use them when writing your layouts, styles or drawables. Using theme attributes makes it much easier to support theming (like dark theme) and to write more flexible, maintainable code. For a deep dive on this, join us in our next post in this series:
Источник
New to android need to understand «?android:attr/actionBarSize»
I was going through Lars Vogel’s tutorial on using Fragments and I came across the following code:
I am not sure what ?android:attr means, especially the question mark.
3 Answers 3
is an attribute.
means: «the size (height) of the action bar».
? is a special character that means it’s an Android internal feature.
Instead of write Numerical number in value of android:layout_marginTop , you can use the height specified by actionBarSize like an Example in Android Training .
You can use ?android:attr or ?attr [ in case support library ] If you need to use any android attributes[ attr ] can be found in R.attr
For More Description about ?android:attr Question 1 ,Question 2
While building android apps, one requires to know the properties of the Android client. Such as screen size etc. One such method is by using android:attr which is android attributes. Here you have mentioned to return a specific attribute by mentioning the keyword after / symbol. Here the keyword is actionBarSize .
The ? symbol is an operator which is used to access system configurations and properties in Android
Not the answer you’re looking for? Browse other questions tagged java android or ask your own question.
Linked
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.12.3.40888
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Источник
What does ?attr/ mean on Android?
I am working on an example about Support Library and Toolbar, this is the code of the layout on the Android documentation
It is the first time I see these ?attr and I have no clue about what they mean or where are these values stored. Are these custom or are they predefined on the Android framework?
2 Answers 2
?attr/ references to attributes. Attributes are values specified in an app’s theme. The attributes in your example are all values specified in the themes provided by the support library. Android also has its very own attributes which can be used with ?android:attr/ .
The actual value that is going to be used in the end depends on the theme used to inflate the said layout. This theme can be specified in the manifest in the block for an app wide theme or in the block for a specific activity. You can also override this theme during runtime by using a different context (see ContextThemeWrapper and LayoutInflater)
It is considered good practice to use theme attributes instead of hardcoded values in your layouts, as it allows for easy customization. For example, when you create custom views, you can use ?attr/colorAccent so that the user of the view doesn’t have to provide a color, and it is going to use the colorAccent used in the app themes instead.
This becomes even more relevant today, as with the introduction of Dark Themes in Android Q, your layouts should specify an attribute so that the end value is different when using a light theme vs a dark theme.
Источник
Can someone explain the attr?
I am looking at the Honeycomb Gallery sample code (here) and I ran across the following code while trying to add action items in my own app:
The ?attr is throwing me for a loop. Can someone please explain what this is doing? How is this related to a drawable? I can’t seem to find any good information on Google. Also is there a listing or gallery of attributes we can use for icons instead of just menuIconCamera ?
Edit: I did some more looking around and found that attrs.xml looks like this:
Unfortunately that just makes it even more confusing for me. What is this doing?
6 Answers 6
The ?attr/menuIconCamera value means that an icon from menuIconCamera attribute of the current theme will be used.
There must be a drawable assigned to the menuIconCamera attribute somewhere in the themes.xml file. If there’re two themes with different values of this attribute then actual icon will depend on a theme which is currently used.
The attrs.xml file is used to define custom attributes. Without this definition compiler will treat unknown attributes as erroneous.
The ?attr: syntax is used for accessing attributes of current theme. See referencing style attributes.
I know this post is very old, but I feel the following explanation will help beginners understand it easily.
So in layman’s terms,
set the value of someAttribute to whatever is the value of attributeName in current theme
A common example occurs in styling a Toolbar
Here value of android:background will be set to @color/primary_color because ?attr/colorPrimary refers to @color/primary_color in the current theme (AppTheme)
My English is not good, sorry. But I know this question
android:icon=»?attr/menuIconCamera» want use
This is for refering style Attributes. see R.attr
‘ is the full package name of whatever declared the resource. More specically, it’s not an XML namespace prefix, even though the syntax might suggest that. For example to refer to an attr declared by the appcompat library, use android.support.v7.appcompat: .
This blog post does an amazing job going over how to reference values for style-attributes that are defined in the current theme: https://trickyandroid.com/android-resources-and-style-attributes-cheatsheet/
When you see ? notation — it means that we are trying to reference a style attribute — a value which may vary depending on current theme. In each specific theme we can override this attribute, so the XML layout doesn’t need to be changed, and the correct theme needs to be applied.
When you see the @ notation — we reference actual resource value (color, string, dimension, etc). This resource should have an actual value. In this case we know exactly what value we are dealing with.
Источник