Android - UI ที่กำหนดเองพร้อมคุณสมบัติที่กำหนดเอง


113

ฉันรู้ว่าเป็นไปได้ที่จะสร้างองค์ประกอบ UI ที่กำหนดเอง (โดยใช้มุมมองหรือส่วนขยายองค์ประกอบ UI เฉพาะ) แต่เป็นไปได้หรือไม่ที่จะกำหนดคุณสมบัติหรือแอตทริบิวต์ใหม่ให้กับองค์ประกอบ UI ที่สร้างขึ้นใหม่ (ฉันหมายถึงไม่ได้รับการสืบทอด แต่เป็นแบรนด์ใหม่ที่กำหนดพฤติกรรมเฉพาะบางอย่างที่ฉันไม่สามารถจัดการกับค่าเริ่มต้นที่เหมาะสมหรือแอตทริบิวต์)

เช่นองค์ประกอบองค์ประกอบที่กำหนดเองของฉัน:

<com.tryout.myCustomElement
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="Element..."
   android:myCustomValue=<someValue>
/>

ดังนั้นจึงเป็นไปได้ที่จะกำหนดMyCustomValue ?

ขอบคุณ



สวัสดีคุณมีบทความดีๆเกี่ยวกับแอตทริบิวต์ที่กำหนดเองใน Android - amcmobileware.org/android/blog/2016/09/11/custom-attributes
Arkadiusz Cieśliński

มีลักษณะที่คำตอบของฉันบนนี้คำถามที่เกี่ยวข้อง
Helios

คำตอบ:


258

ใช่. คำแนะนำสั้น ๆ :

1. สร้างแอตทริบิวต์ XML

สร้างไฟล์ XML ใหม่ภายใน/res/values/attrs.xmlโดยมีแอตทริบิวต์และประเภท

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <declare-styleable name="MyCustomElement">
        <attr name="distanceExample" format="dimension"/>
    </declare-styleable>
</resources>

โดยทั่วไปคุณต้องตั้งค่าหนึ่ง<declare-styleable />สำหรับมุมมองของคุณที่มีแอตทริบิวต์ที่กำหนดเองทั้งหมดของคุณ (ที่นี่เพียงหนึ่งรายการ) ฉันไม่พบรายการประเภทที่เป็นไปได้ทั้งหมดดังนั้นคุณต้องดูแหล่งที่มาสำหรับสิ่งที่ฉันเดา ประเภทที่ผมรู้ว่ามีการอ้างอิง (กับทรัพยากรอื่น) สีบูลมิติลอยจำนวนเต็มและสตริง พวกเขาค่อนข้างอธิบายตัวเอง

2. ใช้แอตทริบิวต์ในเค้าโครงของคุณ

ซึ่งได้ผลเช่นเดียวกับที่คุณทำข้างต้นโดยมีข้อยกเว้นประการหนึ่ง แอตทริบิวต์ที่กำหนดเองของคุณต้องการเป็นเนมสเปซ XML ของตัวเอง

<com.example.yourpackage.MyCustomElement
   xmlns:customNS="http://schemas.android.com/apk/res/com.example.yourpackage"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="Element..."
   customNS:distanceExample="12dp"
   />

ตรงไปตรงมาสวย

3. ใช้ประโยชน์จากค่าที่คุณได้รับ

แก้ไขตัวสร้างของมุมมองแบบกำหนดเองของคุณเพื่อแยกวิเคราะห์ค่า

public MyCustomElement(Context context, AttributeSet attrs) {
    super(context, attrs);

    TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyCustomElement, 0, 0);
    try {
        distanceExample = ta.getDimension(R.styleable.MyCustomElement_distanceExample, 100.0f);
    } finally {
        ta.recycle();
    }
    // ...
}

distanceExampleเป็นตัวแปรสมาชิกส่วนตัวในตัวอย่างนี้ TypedArrayมีสิ่งอื่น ๆ อีกมากมายในการแยกวิเคราะห์ค่าประเภทอื่น ๆ

และนั่นแหล่ะ ใช้ค่าที่แยกวิเคราะห์ในของคุณViewเพื่อแก้ไขเช่นใช้onDraw()เพื่อเปลี่ยนรูปลักษณ์ตามนั้น


7
เพียงแค่ทราบเกี่ยวกับ TypedArray อย่าลืมเรียก recycle () เมื่อทำเสร็จแล้ว
zskalnik

คุณสามารถค้นหารายการดีๆได้ที่นี่github.com/android/platform_frameworks_base/blob/master/core/…
yahya

IDE (eclipse เป็นต้น) กรอกคีย์ / ค่าของแอตทริบิวต์ที่กำหนดเองโดยอัตโนมัติหรือไม่
AlikElzin-kilaka

23
สำหรับการสร้างแบบ gradle คุณควรใช้http://schemas.android.com/apk/res-autoเมื่อประกาศเนมสเปซที่กำหนดเอง
Dori

2
ในขั้นตอนที่ 3 คุณสามารถใช้โดยString initialText = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "initialText");ที่ attr คือ AttributeSet ที่ส่งผ่านในตัวสร้างและ 'initialText' คือชื่อแอตทริบิวต์ที่คุณกำหนดเอง
kosiara - Bartosz Kosarzycki

21

ในโฟลเดอร์ res / values ​​ของคุณให้สร้าง attr.xml คุณสามารถกำหนดคุณลักษณะของคุณได้ที่นั่น:

<declare-styleable name="">
    <attr name="myCustomValue" format="integer/boolean/whatever" />
</declare-styleable>

เมื่อคุณต้องการใช้ในไฟล์เค้าโครงของคุณคุณต้องเพิ่ม

xmlns:customname="http://schemas.android.com/apk/res/your.package.name"

จากนั้นคุณสามารถใช้ค่ากับ customname:myCustomValue=""


นี่ไม่ใช่คำตอบคำถามคือวิธีการเปลี่ยนโปรแกรมจาก java
Fazal

-11

ใช่คุณทำได้เพียงแค่ใช้<resource>แท็ก
แบบนี้:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="CodeFont" parent="@android:style/TextAppearance.Medium">
        <item name="android:layout_width">fill_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textColor">#00FF00</item>
        <item name="android:typeface">monospace</item>
    </style>
</resources>

ลิงค์จากเว็บไซต์ทางการ


ขอบคุณสำหรับคำตอบ. แต่ในทรัพยากรฉันเห็นว่าใช้ค่าเริ่มต้น "android:" ประเด็นของฉันคือฉันขอเช่น android: phoneNameSelected = "true" เป็นพารามิเตอร์ขององค์ประกอบ UI ที่กำหนดเองได้หรือไม่
Waypoint
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.