Android中 @和?區別以及?attr/**與@style/**等的區別

yangxi_001發表於2017-07-07

@和?的區別

 style="?android:attr/progressBarStyleHorizontal"
 style="@android:style/Widget.ProgressBar.Horizontal"
  • 1
  • 2
  • 1
  • 2

在設定style的時候既可以使用@也可以使用?,他們有什麼區別呢??

  • 使用@表示使用固定的style,而不會跟隨Theme改變,這style可以在對應的style.xml中找到。
  • 使用?表示從Theme中查詢引用的資源名,這個google叫預定義樣式,用在多主題時的場景,屬性值會隨著主題而改變。(?需要和attr配合使用)

例如上面的progressBarStyleHorizontal,檢視\platforms\Android-23\data\res\values\themes.xml檔案,可以看到在不同的theme中,progressBarStyleHorizontal引用的style是不同的。看下面的示例:

在Theme中

<item name="progressBarStyleHorizontal">@style/Widget.ProgressBar.Horizontal</item>
  • 1
  • 1

Theme.Holo中為

 <item name="progressBarStyleHorizontal">@style/Widget.Holo.ProgressBar.Horizontal</item>
  • 1
  • 1

style和attr使用區別

style

<!--使用自定義的style-->
@style/Widget.AppCompat.ProgressBar.Horizontal
<!--使用系統自帶的style-->
@android:style/Widget.ProgressBar.Horizontal
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

attr

<!--使用系統自帶的 ,下面兩種方式等效-->
"?android:屬性"
"?android:attr/屬性"
<!--使用自定義的  ,下面兩種方式等效-->
"?attr/屬性"
"?屬性"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

另外:

當引用系統自帶的style和attr時

"@android:style/主題""@style/android:主題"等同

"?android:attr/屬性""?attr/android:屬性"等同
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

自定義隨主題改變的屬性

1、 如果是自定義控制元件,請在style.xml中或attrs.xml中宣告屬性:

<declare-styleable name="SunnyAttr">
    <attr name="sunnyTextColor" format="reference"/>
    <attr name="sunnyBgColor" format="reference"/>
    <attr name="sunnyTextColorWhite" format="color"/>
    <attr name="sunnyTextColorRed" format="reference"/>
    <attr name="textColor" format="reference"></attr>
</declare-styleable>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

如程式碼第五行所示,必須指明format為reference。這樣自定義控制元件的屬性就可以在xml使用,如果不明白,檢視這裡

2、 因為attr/是跟隨Theme來變化的,所以attr跟隨的屬性必須在Theme裡面宣告:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="sunnyTextColorRed">@color/sunnyTextColorRed</item>
</style>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3、 在對應的屬性color,drawable等裡面加入相應的資源

<color name="sunnyTextColorRed">#FFFF0000</color>
  • 1
  • 1

4、這樣就可以在xml中使用自定義控制元件的自定義屬性,這個屬性會隨著主題而改變:

見下面第五行程式碼

<com.smartbracelet.sunny.sunnydemo3.SunnyTextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:text="設定介面"
    app:sunnyTextColor="?attr/sunnyTextColorRed"
    />
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Android xml中 @和?區別,style和attr小結 

android中?attr/** 與@drawable/ ** 或@color/**等的區別

轉自:http://blog.csdn.net/xx326664162/article/details/64125654

相關文章