Android - özel özelliklere sahip özel kullanıcı arayüzü


113

Özel UI öğesi oluşturmanın mümkün olduğunu biliyorum (Görünüm yoluyla veya belirli UI öğesi uzantısı yoluyla). Ancak yeni oluşturulan UI öğelerine yeni özellikler veya öznitelikler tanımlamak mümkün mü (kalıtsal değil, ancak varsayılan özellik veya özniteliklerle başa çıkamadığım bazı belirli davranışları tanımlamak için yepyeni)

ör. öğe özel öğem:

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

Öyleyse MyCustomValue'umu tanımlamak mümkün mü?

Teşekkürler



Merhaba, burada android'deki özel özellikler hakkında güzel bir makaleniz var - amcmobileware.org/android/blog/2016/09/11/custom-attributes
Arkadiusz Cieśliński

Bu ilgili soruya cevabıma bir göz atın .
Helios

Yanıtlar:


258

Evet. Kısa kılavuz:

1. Bir nitelik XML'si oluşturun

İçinde /res/values/attrs.xmlnitelik ve türüne sahip yeni bir XML dosyası oluşturun

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

Temel olarak <declare-styleable />, görünümünüz için tüm özel özniteliklerinizi içeren bir tane ayarlamanız gerekir (burada sadece bir tane). Hiçbir zaman olası türlerin tam listesini bulamadım, bu yüzden sanırım bir tane için kaynağa bakmanız gerekiyor. Bildiğim türler referans (başka bir kaynağa), renk, boole, boyut, kayan nokta, tamsayı ve dizedir . Oldukça açıklayıcılar

2. Düzeninizdeki öznitelikleri kullanın

Bu, bir istisna dışında yukarıda yaptığınız şekilde çalışır. Özel niteliğinizin kendi XML ad alanına ihtiyacı var.

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

Oldukça yalındır.

3. Geçtiğiniz değerlerden yararlanın

Değerleri ayrıştırmak için özel görünümünüzün yapıcısını değiştirin.

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

distanceExamplebu örnekte özel bir üye değişkendir. TypedArraydiğer değer türlerini ayrıştıracak çok şey var.

Ve bu kadar. ViewDeğiştirmek için kendi çözümünüzdeki ayrıştırılmış değeri kullanın , örneğin onDraw()görünümü buna göre değiştirmek için kullanın .


7
TypedArray hakkında not alın. Onlarla işiniz bittiğinde recycle () işlevini çağırdığınızdan emin olun.
zskalnik


IDE (örneğin, tutulma) özel özniteliklerin anahtarlarını / değerlerini otomatik tamamlıyor mu?
AlikElzin-kilaka

23
gradle derlemeleri http://schemas.android.com/apk/res-autoiçin özel ad alanını bildirirken kullanmanız gerekir
Dori

2
3. adımda String initialText = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "initialText");, öznitelik yapıcıda iletilen AttributeSet ve 'initialText' özel öznitelik adınız olduğunda kullanabilirsiniz
kosiara - Bartosz Kosarzycki

21

Res / values ​​klasörünüzde attr.xml oluşturun. Orada niteliklerinizi tanımlayabilirsiniz:

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

Daha sonra mizanpaj dosyanızda kullanmak istediğinizde eklemeniz gerekir

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

ve sonra değeri şununla kullanabilirsiniz: customname:myCustomValue=""


bu cevap değil, soru java'dan programatik olarak nasıl değiştirileceğidir
Fazal

-11

Evet, yapabilirsiniz.Sadece <resource>etiket kullanın .
bunun gibi:

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

resmi web sitesinden bağlantı


Cevap için teşekkürler. Ancak kaynakta varsayılan "android:" değerlerini kullanıyorum. Demek istediğim, özel UI öğemin bir parametresi olarak örneğin android: phoneNameSelected = "true" olabilir mi?
Ara nokta
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.