Android样式:'style =“@ android:style / XYZ”'和'style =“?android:attr / XYZ”'之间的区别?

时间:2012-06-22 14:35:53

标签: android android-layout android-resources android-styles

我正在尝试将按钮设置为Android Full Width ICS style Minimalist Bottom ButtonsViews中的问题。

我已经成功了,对于任何感兴趣的人都有以下xml:

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="bottom"
        android:divider="@android:drawable/divider_horizontal_dark"
        android:gravity="bottom"
        android:orientation="vertical"
        android:paddingTop="16dip"
        android:showDividers="beginning|end" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:measureWithLargestChild="true"
            android:orientation="horizontal"
            android:divider="@android:drawable/divider_horizontal_dark"
            android:showDividers="middle" >                             


            <Button
                android:id="@+id/cancel_button"
                style="?android:attr/buttonBarButtonStyle"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_gravity="left"
                android:layout_weight="1"
                android:maxLines="2"
                android:text="@string/cancel_button" />

            <Button
                android:id="@+id/login_button"
                style="?android:attr/buttonBarButtonStyle"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_gravity="right"
                android:layout_weight="1"
                android:filterTouchesWhenObscured="true"
                android:maxLines="2"
                android:text="@string/login_button" />

        </LinearLayout>
    </LinearLayout>

但有一个问题。 eclipse内容帮助不知道以下资源解析发生了什么:

style="?android:attr/buttonBarButtonStyle"

我熟悉典型的解决方案(eclipse的内容辅助知道)

style=@android/style/...

......但我不清楚两者之间的区别。似乎某些样式属性出现在一个而不是另一个。例如,以下内容无法解决任何问题:

style=@android:attr/buttonBarStyle

,这也不是:

style="@android:style/buttonBarStyle

所以我猜这里有两个问题:

  1. 为什么资源引用语法不同?
  2. 为什么在attr类别下混淆样式的错误分类。
  3. 甚至再次使用的attr类别是什么?
  4. 谢谢!

2 个答案:

答案 0 :(得分:13)

来自another answer SO(在此解释):

在ID前面使用问号意味着您要访问在样式主题中定义的样式属性,而不是对该属性进行硬编码。

将其视为取消引用主题属性以获取它指向的资源,而不是引用属性本身。

Referencing Style Attributes

答案 1 :(得分:1)

?android:attr / buttonBarButtonStyle 或只是?android:buttonBarButtonStyle - (attr是可选的)

<item name="buttonBarButtonStyle">@android:style/Widget.Button</item>

这内部取消引用@android:style / Widget.Button,它在appcompat / res / values / themes.xml 文件中定义。

(?android:) - 始终链接到所应用的当前主题的属性值。 因此允许我们仅引用android定义的样式,而不是创建一个新的并提供硬编码的值。

  

Google Doc说, "It uses the style that is defined by this attribute, in the current theme"