Android預約義樣式?android:attr/attribute、?attr/attribute和?attribute

系統內建屬性

好比系統有一個內建屬性selectableItemBackground,能夠爲可點擊控件設置點擊時的水波紋效果,如下幾種方法均可以成功引用android

// 未設置前
<Button
    />
    
// 設置水波紋點擊效果
<Button
    、、、
    android:foreground="?android:attr/selectableItemBackground"/>
    
// 省略attr/
<Button
    、、、
    android:foreground="?android:selectableItemBackground"/>  
    
// 省略android:
<Button
    、、、
    android:foreground="?attr/selectableItemBackground"/>
    
// 省略android:attr/
<Button
    、、、
    android:foreground="?selectableItemBackground"/>
複製代碼

自定義屬性

咱們先在attrs.xml文件中自定義一個屬性bash

<?xml version="1.0" encoding="utf-8"?>
<resources>
    // 經過format能夠設置各類不一樣的類型,包括style,這裏再也不贅述
    <attr name="myTextColor" format="color"/>
</resources>
複製代碼

此時若是直接引用是沒有效果的,並且會報錯微信

<Button
    、、、
    android:textColor="?attr/myTextColor"
複製代碼

咱們還須要在styles.xml文件中爲這個自定義屬性設置一個默認值,而後再引用就能夠成功了,這裏咱們把Button的文字設置成紅色ide

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="myTextColor">#ff0000</item>
    </style>
</resources>
複製代碼

固然,和內建屬性的引用同樣,咱們也能夠省略掉attr/ui

// 省略掉attr/也是能夠引用成功的
<Button
    、、、
    android:textColor="?myTextColor"
複製代碼

總結

  1. Android內建屬性引用前面能夠加android:,但也能夠省略,自定義屬性則不能夠加
  2. 屬性的引用最短能夠簡化成?attribute,建議該寫法比較簡短
  3. 屬性引用引用的其實不是引用屬性,而是引用該屬性設置的默認值,因此自定義屬性記得在主題中設置引用屬性的默認值,當人也能夠再主題中更改系統內建屬性的默認值

更換主題

參考spa

有一個想法,能夠經過在不一樣的主題中定義同一個自定義屬性的不一樣默認值,而後經過setTheme();方法來切換主題,立刻驗證下.net

首先在attrs.xml文件中自定義一個屬性code

<?xml version="1.0" encoding="utf-8"?>
<resources>
    // 經過format能夠設置各類不一樣的類型,包括style,這裏再也不贅述
    <attr name="myTextColor" format="color"/>
</resources>
複製代碼

而後在styles.xml中定義兩個不一樣的themeorm

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="myTextColor">#ff0000</item>
</style>

<style name="AppThemeGreen" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="myTextColor">#00ff00</item>
</style>
複製代碼

原本想經過Application.setTheme();方法來設置主題,但發現未生效,具體緣由還未去深究,如今只能經過調用Activity.setTheme();方法來設置出題,且必須在setContentView();方法前調用,不然沒法生效,能夠將Activity.setTheme();調用寫在基類BaseActivity的onCreate方法裏。cdn

public class MainActivity extends Activity {

    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // setTheme(R.style.AppTheme);
        // 能夠有一個換膚的頁面供選擇,而後把選擇的選擇的theme保存到Sharepreference中
        setTheme(R.style.AppThemeGreen);
        setContentView(R.layout.activity_main);
}
複製代碼

總結:

  1. Application.setTheme()設置主題沒法生效
  2. Activity.setTheme()設置主題需在setContentView以前調用才能生效

缺點: 1.假設有個換膚選擇的Activity頁面,選擇後沒法實時生效,需重啓Activity。就是說已打開的Activity是沒法立刻看到效果的,新打開的Activity纔可以看到換膚效果。 2.該換膚實現方式的全部主題需寫死在styles.xml文件內,沒法實現後臺下載新皮膚。至於下載新皮膚網上有經過apk文件的方式,之後能夠深刻研究下。

參考

若是喜歡個人文章,能夠掃描如下二維碼關注個人微信公衆號,我會按期發佈最新的文章。

相關文章
相關標籤/搜索