建立檢視畫面類別

試用 Compose
Jetpack Compose 是 Android 推薦的 UI 工具包。瞭解如何在 Compose 中使用版面配置。

設計良好的自訂檢視區塊就像任何其他設計精良的類別一樣。它會封裝 一組特定的 可透過簡單介面輕鬆使用 CPU 和記憶體等。於 設計完善的類別,自訂檢視區塊必須執行以下操作:

  • 符合 Android 標準。
  • 提供可與 Android XML 版面配置搭配使用的自訂樣式屬性。
  • 傳送無障礙功能事件。
  • 與多個 Android 平台相容。

Android 架構提供一組基礎類別和 XML 標記,協助您建立檢視畫面 符合上述所有 Google Cloud 就是最佳選擇本課程將說明如何使用 Android 架構建立核心 檢視畫面功能 類別

如要進一步瞭解 自訂檢視畫面元件一文。

將檢視畫面設為子類別

Android 架構中定義的所有檢視區塊類別,都會擴充 View。您的 也可透過自訂檢視畫面 您可以直接擴充 View,或者也可以 擴充 Kubernetes 叢集 現有資料檢視 子類別,例如 Button

如要允許 Android Studio 與您的檢視畫面互動,您至少必須提供一個能接收 ContextAttributeSet 物件做為參數。 此建構函式允許版面配置編輯器建立及編輯檢視畫面的例項。

Kotlin

class PieChart(context: Context, attrs: AttributeSet) : View(context, attrs)

Java

class PieChart extends View {
    public PieChart(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
}

定義自訂屬性

如要將內建的 View 新增至使用者介面,請在 XML 元素中指定並 控制 呈現這些元素您也可以新增自訂樣式 資料檢視目的地: 在自訂檢視畫面中啟用這項行為,請按照下列步驟操作:

  • <declare-styleable> 資源元素中為檢視畫面定義自訂屬性。
  • 在 XML 版面配置中指定屬性值。
  • 在執行階段擷取屬性值。
  • 將擷取的屬性值套用至檢視畫面。

本節會探討如何定義自訂屬性及指定其值。 下一節涵蓋 在執行階段擷取及套用值

如要定義自訂屬性,請在專案中加入 <declare-styleable> 資源。將這些資源放在 res/values/attrs.xml 檔案。接下來 attrs.xml 檔案的範例:

<resources>
   <declare-styleable name="PieChart">
       <attr name="showText" format="boolean" />
       <attr name="labelPosition" format="enum">
           <enum name="left" value="0"/>
           <enum name="right" value="1"/>
       </attr>
   </declare-styleable>
</resources>

這個程式碼宣告了兩個自訂屬性 showTextlabelPosition。 屬於某個可自訂樣式的 名為「PieChart」的實體。可設定樣式的實體名稱依照慣例,也就是 做為 類別名稱 定義自訂檢視畫面雖然您不需要遵守這個慣例 許多熱門程式碼 編輯必須遵循這項命名慣例,才能提供完整的陳述式。

定義自訂屬性後,即可像內建屬性一樣在版面配置 XML 檔案中使用這些屬性 屬性。只有 差別在於自訂屬性屬於不同的命名空間。非歸屬感 屬於 http://schemas.android.com/apk/res/android 命名空間,屬於 http://schemas.android.com/apk/res/[your package name]。以下舉例說明 定義 PieChart:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:custom="http://schemas.android.com/apk/res-auto">
 <com.example.customviews.charting.PieChart
     custom:showText="true"
     custom:labelPosition="left" />
</LinearLayout>

為避免需要重複較長的命名空間 URI,此範例會使用 xmlns 指令。這個指令會將別名 custom 指派給 命名空間 http://schemas.android.com/apk/res/com.example.customviews 您可以為命名空間選擇任何別名。

請注意,用於將自訂檢視區塊新增至版面配置的 XML 標記名稱。這一切 完整名稱 自訂檢視區塊類別。如果檢視區塊類別是內部類別,請進一步驗證類別 我們會與檢視區塊的外部類別命名 舉例來說, PieChart 類別具有名為 PieView 的內部類別。如要使用 自訂屬性 使用 com.example.customviews.charting.PieChart$PieView 標記。

套用自訂屬性

透過 XML 版面配置建立檢視畫面時,系統會讀取 XML 標記中的所有屬性 從資源中移除 並傳遞至檢視畫面的建構函式 AttributeSet。 雖然 可以直接讀取 AttributeSet 中的值 有一些缺點:

  • 系統不會解析屬性值中的資源參照。
  • 未套用樣式。

請改為將 AttributeSet 傳遞至 obtainStyledAttributes()。 這個方法會傳回一個 TypedArray 陣列的 屬於 已解除參照和設定樣式

Android 資源編譯器進行大量呼叫 obtainStyledAttributes() 讓您更容易每 <declare-styleable> 所產生的 R.java 會定義 res/ 目錄中的屬性陣列 以及一組 定義陣列中每項屬性索引的常數。您可以使用預先定義的 要讀取的常數 TypedArray 中的屬性。方法如下 PieChart 類別 讀取其屬性:

Kotlin

init {
    context.theme.obtainStyledAttributes(
            attrs,
            R.styleable.PieChart,
            0, 0).apply {

        try {
            mShowText = getBoolean(R.styleable.PieChart_showText, false)
            textPos = getInteger(R.styleable.PieChart_labelPosition, 0)
        } finally {
            recycle()
        }
    }
}

Java

public PieChart(Context context, AttributeSet attrs) {
   super(context, attrs);
   TypedArray a = context.getTheme().obtainStyledAttributes(
        attrs,
        R.styleable.PieChart,
        0, 0);

   try {
       mShowText = a.getBoolean(R.styleable.PieChart_showText, false);
       textPos = a.getInteger(R.styleable.PieChart_labelPosition, 0);
   } finally {
       a.recycle();
   }
}

請注意,TypedArray 物件 這項共用資源 且在使用後必須回收。

新增資源和事件

屬性是控制檢視畫面行為和外觀的強大方法 這些模型只能讀取 當檢視區塊初始化時。如要提供動態行為,請公開屬性 getter 和 個別的 setter 組合 自訂屬性。下列程式碼片段顯示 PieChart 如何公開屬性 名為 showText

Kotlin

fun isShowText(): Boolean {
    return mShowText
}

fun setShowText(showText: Boolean) {
    mShowText = showText
    invalidate()
    requestLayout()
}

Java

public boolean isShowText() {
   return mShowText;
}

public void setShowText(boolean showText) {
   mShowText = showText;
   invalidate();
   requestLayout();
}

請注意,setShowText 呼叫 invalidate()requestLayout()。這些呼叫很重要 確保檢視畫面能穩定運作您需要具備 ,在可能變更資料檢視的屬性後失效 這樣 系統就會知道需要重新繪製同樣地,在下列情況下,您必須要求新的版面配置: 資源變更方式 可能會影響檢視畫面的大小或形狀清除這些方法呼叫可能會導致 很難找到 蟲子

自訂檢視畫面也必須支援事件監聽器,用來傳送重要事件。適用對象 執行個體,PieChart 會公開名為 OnCurrentItemChanged 的自訂事件,以通知事件監聽器 使用者旋轉了 製作圓餅圖。

很容易忘記公開屬性和事件,特別是當你是唯一的使用者時 自訂檢視區塊 花時間仔細定義檢視區塊的介面,可減少日後的維護成本 。 建議您一律公開所有會影響 外觀或行為 自訂檢視畫面

將無障礙設計納入設計考量

自訂檢視畫面必須支援各種使用者。這包括具有 身心障礙 防止使用者看到或使用觸控螢幕為協助身心障礙使用者 :

  • 使用 android:contentDescription 為輸入欄位加上標籤 屬性。
  • 呼叫 sendAccessibilityEvent() 來傳送無障礙功能事件 。
  • 支援替代控制器,例如 D-Pad 或軌跡球。

如要進一步瞭解如何建立無障礙檢視畫面,請參閱 提高應用程式的無障礙程度