在安卓系统中,?attr/代表什么意思?

57

我正在研究关于Support Library和Toolbar的示例,这是Android文档中布局的代码。

<android.support.v7.widget.Toolbar
    android:id="@+id/my_toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    android:elevation="4dp"
    android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

这是我第一次看到这些?attr,我不知道它们的含义或者这些值存储在哪里。这些是自定义的还是在安卓框架上预定义的?

参考:安卓工具栏文档

3个回答

65

?attr/是指属性引用。属性是在应用程序主题中指定的值。您示例中的属性都是在support库提供的主题中指定的值。Android还有自己的属性,可以与?android:attr/一起使用。

最终使用的实际值取决于用于填充所述布局的主题。此主题可以在应用程序范围的主题中在清单文件中的<application/>块中指定,也可以在特定活动的<activity/>块中指定。您还可以通过使用不同的上下文在运行时覆盖此主题(参见ContextThemeWrapperLayoutInflater)

使用主题属性而不是硬编码值来创建布局被认为是良好的做法,因为它允许进行易于定制的操作。例如,当您创建自定义视图时,可以使用?attr/colorAccent,这样视图的用户就无需提供颜色,而是使用应用程序主题中使用的colorAccent

随着在Android Q中引入暗黑主题,今天这一点变得更加重要,您的布局应该指定一个属性,以便在使用浅色主题与暗黑主题时具有不同的最终值。


属性是在应用程序主题中指定的值。哪个主题?Android 中有很多主题。如果可能的话,需要更多的解释和示例。 - oiyio

10

3
与其设置一个静态的颜色(#ffffff或者一个@color资源),我们可以使用?attr/themeAttributeName语法委托主题。这个语法的意思是:查询主题的语义属性值。这篇关于样式和主题的Medium文章给出了相当详细的解释。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接