Android - UI khusus dengan atribut khusus

113

Saya tahu itu mungkin untuk membuat elemen UI kustom (melalui View atau ekstensi elemen UI tertentu). Tetapi apakah mungkin untuk menentukan properti atau atribut baru ke elemen UI yang baru dibuat (maksud saya tidak diwariskan, tetapi baru untuk menentukan beberapa perilaku tertentu yang tidak dapat saya tangani dengan propertis atau atribut default)

misalnya elemen elemen kustom saya:

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

Jadi, apakah mungkin untuk menentukan MyCustomValue ?

Terima kasih

Waypoint
sumber
Hai, Anda memiliki beberapa artikel bagus tentang atribut khusus di android - amcmobileware.org/android/blog/2016/09/11/custom-attributes
Arkadiusz Cieśliński
Lihatlah jawaban saya pada pertanyaan terkait ini .
Helios

Jawaban:

258

Iya. Panduan singkat:

1. Buat atribut XML

Buat file XML baru di dalamnya /res/values/attrs.xml, dengan atribut dan tipenya

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

Pada dasarnya Anda harus menyiapkan satu <declare-styleable />untuk tampilan Anda yang berisi semua atribut khusus Anda (di sini hanya satu). Saya tidak pernah menemukan daftar lengkap kemungkinan jenis, jadi Anda perlu melihat sumbernya, saya kira. Jenis yang saya tahu adalah referensi (ke sumber daya lain), warna, boolean, dimensi, float, integer, dan string . Mereka cukup jelas

2. Gunakan atribut dalam tata letak Anda

Itu bekerja dengan cara yang sama seperti yang Anda lakukan di atas, dengan satu pengecualian. Atribut khusus Anda membutuhkan namespace XML-nya sendiri.

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

Cukup lurus ke depan.

3. Manfaatkan nilai-nilai yang Anda lewati

Ubah konstruktor tampilan kustom Anda untuk mengurai nilai.

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

distanceExampleadalah variabel anggota privat dalam contoh ini. TypedArraypunya banyak hal lain untuk mengurai jenis nilai lainnya.

Dan itu dia. Gunakan nilai parsing Anda Viewuntuk memodifikasinya, misalnya menggunakannya onDraw()untuk mengubah tampilan yang sesuai.

uthark
sumber
7
Perhatikan saja tentang TypedArray. Pastikan untuk memanggil recycle () setelah selesai menggunakannya.
zskalnik
Di sini Anda dapat menemukan daftar yang bagus github.com/android/platform_frameworks_base/blob/master/core/…
yahya
Apakah IDE (misalnya gerhana) melengkapi otomatis kunci / nilai atribut khusus?
AlikElzin-kilaka
23
untuk build gradle sebaiknya Anda gunakan http://schemas.android.com/apk/res-autosaat mendeklarasikan namespace kustom
Dori
2
Pada langkah 3, Anda cukup menggunakan di String initialText = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "initialText");mana attr adalah AttributeSet yang diteruskan dalam konstruktor dan 'initialText' adalah nama atribut khusus Anda
kosiara - Bartosz Kosarzycki
21

Dalam folder res / values ​​buat attr.xml. Di sana Anda dapat menentukan sikap Anda:

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

Ketika Anda kemudian ingin menggunakannya di file tata letak Anda, Anda harus menambahkan

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

dan kemudian Anda dapat menggunakan nilainya dengan customname:myCustomValue=""

Maria Neumayer
sumber
ini bukan jawabannya, pertanyaannya adalah bagaimana cara mengubah secara programatik dari java
Fazal
-11

Ya, Anda bisa. Cukup gunakan <resource>tag.
seperti ini:

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

tautan dari situs web resmi

Frank Cheng
sumber
Terima kasih atas jawabannya. Namun dalam sumber daya, saya melihat menggunakan nilai default "android:". Maksud saya adalah, dapatkah saya memiliki misalnya android: phoneNameSelected = "true" sebagai parameter elemen UI khusus saya?
Waypoint