Android - giao diện người dùng tùy chỉnh với các thuộc tính tùy chỉnh


113

Tôi biết có thể tạo phần tử giao diện người dùng tùy chỉnh (bằng Chế độ xem hoặc phần mở rộng phần tử giao diện người dùng cụ thể). Nhưng liệu có thể xác định các thuộc tính hoặc thuộc tính mới cho các phần tử giao diện người dùng mới được tạo không (ý tôi là không được kế thừa, mà là thương hiệu mới để xác định một số hành vi cụ thể mà tôi không thể xử lý với các thuộc tính hoặc hàm thích hợp mặc định)

ví dụ: phần tử tùy chỉnh của tôi:

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

Vậy có thể định nghĩa MyCustomValue không?

Cám ơn



Hey ở đây bạn có một số bài viết tốt đẹp về các thuộc tính tuỳ chỉnh trong android - amcmobileware.org/android/blog/2016/09/11/custom-attributes
Arkadiusz Cieśliński

Hãy xem câu trả lời của tôi về câu hỏi liên quan này .
Helios

Câu trả lời:


258

Đúng. Hướng dẫn ngắn gọn:

1. Tạo một XML thuộc tính

Tạo một tệp XML mới bên trong /res/values/attrs.xml, với thuộc tính và loại của nó

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

Về cơ bản, bạn phải thiết lập một <declare-styleable />cho chế độ xem chứa tất cả các thuộc tính tùy chỉnh của bạn (ở đây chỉ là một). Tôi chưa bao giờ tìm thấy danh sách đầy đủ các loại có thể có, vì vậy bạn cần phải xem nguồn để biết tôi đoán. Các loại mà tôi biết là tham chiếu (đến một tài nguyên khác), màu, boolean, thứ nguyên, float, số nguyên và chuỗi . Chúng khá dễ hiểu

2. Sử dụng các thuộc tính trong bố cục của bạn

Điều đó hoạt động giống như cách bạn đã làm ở trên, với một ngoại lệ. Thuộc tính tùy chỉnh của bạn cần có không gian tên XML riêng.

<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"
   />

Khá thẳng về phía trước.

3. Tận dụng các giá trị bạn nhận được

Sửa đổi hàm tạo của chế độ xem tùy chỉnh của bạn để phân tích cú pháp các giá trị.

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();
    }
    // ...
}

distanceExamplelà một biến thành viên riêng trong ví dụ này. TypedArraycó rất nhiều thứ khác để phân tích cú pháp các loại giá trị khác.

Và đó là nó. Sử dụng giá trị được phân tích cú pháp trong của bạn Viewđể sửa đổi nó, ví dụ: sử dụng nó trong onDraw()để thay đổi giao diện cho phù hợp.


7
Chỉ cần lưu ý về TypedArray. Đảm bảo gọi recycle () khi hoàn tất với chúng.
zskalnik

Tại đây, bạn có thể tìm thấy danh sách tốt github.com/android/platform_frameworks_base/blob/master/core/…
yahya Ngày

IDE (ví dụ: nhật thực) có tự động hoàn thành các khóa / giá trị của các thuộc tính tùy chỉnh không?
AlikElzin-kilaka

23
cho các bản dựng gradle bạn nên sử dụng http://schemas.android.com/apk/res-autokhi khai báo không gian tên tùy chỉnh
Dori

2
Trong bước 3, bạn chỉ có thể sử dụng String initialText = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "initialText");nơi attr là AttributeSet được thông qua tại các nhà xây dựng và 'initialText' là tên của bạn tùy chỉnh thuộc tính
kosiara - Bartosz Kosarzycki

21

Trong thư mục res / values ​​của bạn, hãy tạo attr.xml. Ở đó, bạn có thể xác định các thuộc tính của mình:

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

Khi bạn muốn sử dụng nó trong tệp bố cục của mình, bạn phải thêm

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

và sau đó bạn có thể sử dụng giá trị với customname:myCustomValue=""


đây không phải là câu trả lời, câu hỏi là làm thế nào để programatically thay đổi từ java
Fazal

-11

Có, bạn có thể. Chỉ cần sử dụng <resource>thẻ.
như thế này:

<?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>

liên kết từ trang web chính thức


Cảm ơn về câu trả lời. Nhưng trong tài nguyên, tôi thấy sử dụng các giá trị "android:" mặc định. Ý của tôi là, tôi có thể lấy ví dụ: android: phoneNameSelected = "true" làm tham số của phần tử giao diện người dùng tùy chỉnh của mình không?
Waypoint
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.