สร้างชั้นเรียนสำหรับดู

ลองใช้วิธีการเขียน
Jetpack Compose เป็นชุดเครื่องมือ UI ที่แนะนำสำหรับ Android ดูวิธีใช้งานเลย์เอาต์ใน Compose

มุมมองที่กำหนดเองที่ออกแบบมาอย่างดีก็เหมือนกับชั้นเรียนที่ออกแบบอย่างดีอื่นๆ สรุป ชุดของ ที่มีอินเทอร์เฟซที่เรียบง่าย ใช้ CPU และหน่วยความจำอย่างมีประสิทธิภาพ เป็นต้น ใน นอกเหนือจากการเป็น ออกแบบมาเป็นอย่างดี มุมมองที่กำหนดเองจะต้องทำสิ่งต่อไปนี้

  • เป็นไปตามมาตรฐาน Android
  • ระบุแอตทริบิวต์ที่จัดรูปแบบได้ที่กำหนดเองซึ่งใช้ได้กับเลย์เอาต์ Android XML
  • ส่งเหตุการณ์การช่วยเหลือพิเศษ
  • เข้ากันได้กับแพลตฟอร์ม Android หลายแพลตฟอร์ม

เฟรมเวิร์ก Android มีชุดคลาสพื้นฐานและแท็ก XML เพื่อช่วยคุณสร้างมุมมองที่ ตรงกับทั้งหมดนี้ บทเรียนนี้จะกล่าวถึงวิธีใช้เฟรมเวิร์ก Android เพื่อสร้าง ฟังก์ชันของมุมมอง

คุณสามารถค้นหา ข้อมูลในคอมโพเนนต์มุมมองที่กำหนดเอง

คลาสย่อยของข้อมูลพร็อพเพอร์ตี้

คลาสการดูทั้งหมดที่กำหนดไว้ในเฟรมเวิร์กของ Android View บัญชี มุมมองที่กำหนดเองยังสามารถ ขยายเวลา View โดยตรง หรือคุณสามารถ ประหยัดเวลาด้วยการขยาย ข้อมูลพร็อพเพอร์ตี้ที่มีอยู่ คลาสย่อย เช่น Button

หากต้องการให้ Android Studio สามารถโต้ตอบกับมุมมองของคุณได้ อย่างน้อยที่สุดคุณต้องระบุเครื่องมือสร้างที่ใช้ Context และออบเจ็กต์ AttributeSet เป็นพารามิเตอร์ เครื่องมือสร้างนี้ช่วยให้ตัวแก้ไขเลย์เอาต์สามารถสร้างและแก้ไขอินสแตนซ์ของมุมมองได้

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 และ ควบคุม ลักษณะและลักษณะการทำงานของ แอตทริบิวต์ขององค์ประกอบ คุณยังสามารถเพิ่มและกำหนดสไตล์ การดูด้วย 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>

โค้ดนี้จะประกาศแอตทริบิวต์ที่กำหนดเอง 2 รายการ ได้แก่ showText และ labelPosition ที่เป็นสไตล์ เอนทิตีที่ชื่อ 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> แต่ละรายการ ทรัพยากรในไดเรกทอรี res/ R.java ที่สร้างขึ้นจะระบุทั้งอาร์เรย์ของแอตทริบิวต์ รหัสและชุดของ ค่าคงที่ที่กำหนดดัชนีสำหรับแต่ละแอตทริบิวต์ในอาร์เรย์ คุณใช้เทมเพลตที่กำหนดไว้ล่วงหน้า ค่าคงที่ที่จะอ่าน แอตทริบิวต์จาก 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 พร็อพเพอร์ตี้และ คู่ตัวตั้งค่าสำหรับแต่ละ แอตทริบิวต์ที่กำหนดเอง ข้อมูลโค้ดต่อไปนี้แสดงวิธีที่ 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() การโทรเหล่านี้มีความสำคัญ เพื่อให้แน่ใจว่ามุมมองจะทำงานอย่างเสถียร คุณต้องมี เพื่อทำให้ข้อมูลพร็อพเพอร์ตี้เป็นโมฆะหลังจากมีการเปลี่ยนแปลงในพร็อพเพอร์ตี้ที่อาจเปลี่ยนแปลง ดังนั้น ระบบรู้ว่าจะต้องมีการสร้าง URL ใหม่ ในทำนองเดียวกัน คุณต้องขอการออกแบบใหม่หาก มีการเปลี่ยนแปลงพร็อพเพอร์ตี้ในทางหนึ่ง ซึ่งอาจส่งผลต่อขนาดหรือรูปร่างของมุมมอง การลืมการเรียกเมธอดเหล่านี้อาจทำให้ หายาก ข้อบกพร่อง

มุมมองที่กำหนดเองต้องรองรับ Listener เหตุการณ์เพื่อสื่อสารเหตุการณ์สำคัญด้วย สำหรับ อินสแตนซ์ PieChart แสดงเหตุการณ์ที่กำหนดเองชื่อ OnCurrentItemChanged เพื่อแจ้งให้ผู้ฟังทราบว่า ผู้ใช้หมุน แผนภูมิวงกลมเพื่อเน้นชิ้นส่วนใหม่

เป็นเรื่องง่ายที่จะลืมแสดงพร็อพเพอร์ตี้และกิจกรรม โดยเฉพาะเมื่อคุณมีผู้ใช้เพียงคนเดียว ของมุมมองที่กำหนดเอง การใช้เวลากำหนดอินเทอร์เฟซของข้อมูลพร็อพเพอร์ตี้อย่างรอบคอบจะช่วยลดการบำรุงรักษาในอนาคต กฎที่ดีที่ควรปฏิบัติตามคือ แสดงพร็อพเพอร์ตี้ใดๆ ก็ตามที่มีผลต่อการแสดงผล ลักษณะหรือลักษณะการทำงานของ มุมมองที่กำหนดเอง

ออกแบบเพื่อความสามารถเข้าถึงได้ง่าย

มุมมองที่กำหนดเองต้องรองรับผู้ใช้ในวงกว้าง ซึ่งรวมถึงผู้ใช้ที่มี ความพิการ ป้องกันไม่ให้บุตรหลานเห็นหรือใช้หน้าจอสัมผัส ในการสนับสนุนผู้ใช้ที่มีความพิการ ให้ทำดังนี้

  • ติดป้ายกำกับช่องป้อนข้อมูลโดยใช้ android:contentDescription
  • ส่งเหตุการณ์การช่วยเหลือพิเศษโดยโทรหา sendAccessibilityEvent() ตามความเหมาะสม
  • รองรับตัวควบคุมสำรอง เช่น D-pad หรือแทร็กบอล

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการสร้างมุมมองที่เข้าถึงได้ โปรดดู ทำให้เข้าถึงแอปได้ง่ายขึ้น