转自: 英文:trickyandroid   翻译:jcodecraeer   

www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2017/0324/7720.html


通过xml布局设置一个view的background color的几种方法:

android:background="@color/colorPrimary"  

android:background="@com.myapp:color/colorPrimary"  

android:background="?colorPrimary"  

android:background="?attr/colorPrimary"  

android:background="?com.myapp:attr/colorPrimary"  

android:background="?com.myapp:colorPrimary"  

android:background="?android:colorPrimary"  

android:background="?android:attr/colorPrimary"


够刺激,是吧?好吧,我希望可以把它拆解一下,这样就可以不那么吓人了。

引用资源(resources) vs 引用样式属性(style attribute)

先打断一下话题讲一下Android的基础,因为在进一步解释之前,理解 @ 和 ? 之间的区别是很重要的。

当我们使用@ -我们是引用一个实际的值(color, string, dimension,等等)。这个资源必须有具体的值,这种情况下我们知道自己处理的具体值。

比如
app/src/main/res/values/color.xml

<?xml version="1.0" encoding="utf-8"?>  

<resources>  

    <color name="colorPrimary">#3F51B5

resources>


因此当我们想在xml中引用它的时候(android:background=”@color/colorPrimary”),不管这个activity是什么主题的,background都将被设置为#3F51B5 。

反之,当你看到? 标记-那就意味着我们在尝试引用一个style attribute ,其值取决于当前使用的主题。在特定的主题下我可以重写这个属性,因此不需要改变xml布局,只需应用恰当的主题就是了:

<resources>  

    name="AppTheme" parent="Theme.AppCompat.Light">

        name="colorPrimary">#F00

    

resources>


<TextView  

    android:id="@+id/my_text"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:background="?colorPrimary"/>


在这种情况下,我们询问Android:“嘿,把当前主题下定义的colorPrimary属性的值给我”。所以我们很难告诉你background到底会是什么颜色,因为它取决于这个布局所属的activity应用的主题。

语法

现在,让我们来看看引用资源的语法到底是什么样的。

引用resources (@)

@[包名:]资源类型/资源名

  • 包名 – 可选项,即这个资源所属的包的名称(默认就是你app的包名);预留的包-android,用于与系统一起发布的资源。

  • 资源类型 – R的子集,即资源的类型(attr, color, string, dimen,等等)

  • 资源名 – 我们要引用的资源的名称

让我们先举2个例子:

android:background="@color/colorPrimary"  

android:background="@com.myapp:color/colorPrimary"


这两个都是引用相同的资源,因为默认包名就是自己app的包名,所以可以不写出来:

  • package(可选) = com.myapp

  • 资源类型 = color

  • 资源名 = colorPrimary

你可能会想,安卓不是预先定义了一些系统级别的资源吗?是的,比如可以这样引用一些内置的颜色:

android:background="@android:color/holo_orange_dark"

这个例子拆解开来就是:

  • package = android – 引用内置的资源

  • 资源类型 = color

  • 资源名 = holo_orange_dark

请注意:

现在,许多开发者都使用AppCompat(如果你还没有,那么建议你这样做),而AppCompat通常定义了自己的资源。虽然AppCompat属于谷歌自己发布的lib,但是它并不是系统的一部分。实际上,那些资源整合到了你的app中,因此不需要使用android关键字来引用。

例子:

android:background="?selectableItemBackground"

这里,即使我们app中并没有自定义的属性名selectableItemBackground(注意这里没有使用 android: 前缀),我们仍然可以引用它,因为我们通过AppCompat把它“添加”到了我们的app中。

引用样式属性(?)

你猜怎么着,它的语法相当类似于引用resources:

?[包名:][资源类型/]资源名称

只是有点小区别:

引用样式属性的时候唯一允许的资源类型是attr。所以实际上Android打包工具允许我们省略资源类型,因此实际上它是一个可选项。

所以从Android的角度来看,下面的表述方式其实完全是一样的:

android:background="?com.myapp:attr/colorPrimary" //verbose format  

android:background="?com.myapp:colorPrimary" //attr is skipped since its optional  

android:background="?attr/colorPrimary" //package is skipped since its optional  

android:background="?colorPrimary"  // package & attr is skipped


就如你看到的那样,其实语法是超级简单的,再也不会困惑了!


更多相关文章

  1. Relative Layout 中用到的一些属性
  2. android button属性
  3. selector属性介绍
  4. Android 资源文件中的符号含义与说明

随机推荐

  1. flex初体验之常用属性练习
  2. 2021.7.6表格作业,
  3. flex布局中容器及项目常用属性演示
  4. flex容器以及属性
  5. flex容器与项目中常用的属性
  6. AJAX的原理
  7. 无头浏览器Selenium的使用要点
  8. FROM表单实践以及心得
  9. 仿京东移动端首页的"部分"样式
  10. 首页秒杀区