向檢視新增屬性

自定義檢視還可以採用可在 Android 佈局資原始檔中使用的自定義屬性。要向自定義檢視新增屬性,你需要執行以下操作:

  1. 定義屬性的名稱和型別: 這是在 res/values/attrs.xml 內完成的(必要時建立它)。以下檔案定義了笑臉的面部顏色的顏色屬性和笑臉表情的列舉屬性:

    <resources>
        <declare-styleable name="SmileyView">
            <attr name="smileyColor" format="color" />
            <attr name="smileyExpression" format="enum">
                <enum name="happy" value="0"/>
                <enum name="sad" value="1"/>
            </attr>
        </declare-styleable>
        <!-- attributes for other views -->
    </resources>
    
  2. 在佈局中使用你的屬性: 這可以在使用自定義檢視的任何佈局檔案中完成。以下佈局檔案建立一個帶有快樂黃色笑臉的螢幕:

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_height="match_parent"
        android:layout_width="match_parent">
    
        <com.example.app.SmileyView
            android:layout_height="56dp"
            android:layout_width="56dp"
            app:smileyColor="#ffff00"
            app:smileyExpression="happy" />
    </FrameLayout>
    

    提示:自定義屬性不適用於 Android Studio 2.1 及更早版本(以及可能的未來版本)中的 tools:字首。在這個例子中,用 tools:smileyColor 替換 app:smileyColor 將導致 smileyColor 既不在執行時也不在設計時設定。

  3. 閱讀你的屬性: 這是在你的自定義檢視原始碼中完成的。以下的 SmileyView 片段演示瞭如何提取屬性:

    public class SmileyView extends View {
        // ...
    
        public SmileyView(Context context) {
            this(context, null);
        }
    
        public SmileyView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public SmileyView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
    
            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SmileyView, defStyleAttr, 0);
            mFaceColor = a.getColor(R.styleable.SmileyView_smileyColor, Color.TRANSPARENT);
            mFaceExpression = a.getInteger(R.styleable.SmileyView_smileyExpression, Expression.HAPPY);
            // Important: always recycle the TypedArray
            a.recycle();
    
            // initPaints(); ...
        }
    }
    
  4. (可選)新增預設樣式: 通過新增具有預設值的樣式並將其載入到自定義檢視中來完成此操作。以下預設笑臉樣式代表一個快樂的黃色樣式:

    <!-- styles.xml -->
    <style name="DefaultSmileyStyle">
        <item name="smileyColor">#ffff00</item>
        <item name="smileyExpression">happy</item>
    </style>
    

    通過將它新增為 obtainStyledAttributes 呼叫的最後一個引數(參見步驟 3 中的程式碼),將其應用於我們的 SmileyView

    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SmileyView, defStyleAttr, R.style.DefaultSmileyViewStyle);
    

    請注意,在膨脹的佈局檔案中設定的任何屬性值(請參閱步驟 2 中的程式碼)都將覆蓋預設樣式的相應值。

  5. (可選)在主題中提供樣式: 這是通過新增新樣式引用屬性來完成的,該屬性可以在主題中使用併為該屬性提供樣式。這裡我們簡單地命名我們的引用屬性 smileyStyle

    <!-- attrs.xml -->
    <attr name="smileyStyle" format="reference" />
    

    然後我們在我們的應用主題中提供樣式(這裡我們只重用步驟 4 中的預設樣式):

    <!-- themes.xml -->
    <style name="AppTheme" parent="AppBaseTheme">
        <item name="smileyStyle">@style/DefaultSmileyStyle</item>
    </style>