Android: interfaccia utente personalizzata con attributi personalizzati


113

So che è possibile creare un elemento dell'interfaccia utente personalizzato (tramite View o un'estensione specifica dell'elemento dell'interfaccia utente). Ma è possibile definire nuove proprietà o attributi per gli elementi dell'interfaccia utente appena creati (intendo non ereditato, ma nuovo di zecca per definire alcuni comportamenti specifici che non sono in grado di gestire con proprietà o attributi predefiniti)

ad es. elemento mio elemento personalizzato:

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

Quindi è possibile definire MyCustomValue ?

Grazie



Ehi, ecco un bell'articolo sugli attributi personalizzati in Android - amcmobileware.org/android/blog/2016/09/11/custom-attributes
Arkadiusz Cieśliński

Dai un'occhiata alla mia risposta su questa domanda correlata.
Helios

Risposte:


258

Sì. Breve guida:

1. Creare un attributo XML

Crea un nuovo file XML all'interno /res/values/attrs.xml, con l'attributo e il suo tipo

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

Fondamentalmente devi impostarne uno <declare-styleable />per la tua vista che contenga tutti i tuoi attributi personalizzati (qui solo uno). Non ho mai trovato un elenco completo dei possibili tipi, quindi è necessario cercare la fonte per uno immagino. I tipi che conosco sono riferimenti (a un'altra risorsa), color, boolean, dimension, float, integer e string . Sono abbastanza autoesplicativi

2. Usa gli attributi nel tuo layout

Funziona allo stesso modo che hai fatto sopra, con un'eccezione. L'attributo personalizzato necessita del proprio spazio dei nomi 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"
   />

Abbastanza diretto.

3. Utilizza i valori che ti vengono trasmessi

Modifica il costruttore della tua visualizzazione personalizzata per analizzare i valori.

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è una variabile membro privata in questo esempio. TypedArrayha molte altre cose per analizzare altri tipi di valori.

E questo è tutto. Usa il valore analizzato nel tuo Viewper modificarlo, ad esempio usalo onDraw()per cambiare l'aspetto di conseguenza.


7
Nota solo su TypedArray. Assicurati di chiamare recycle () quando hai finito con loro.
zskalnik


L'IDE (eclipse ad esempio) completa automaticamente le chiavi / i valori degli attributi personalizzati?
AlikElzin-kilaka

23
per le build gradle dovresti usare http://schemas.android.com/apk/res-autoquando dichiari lo spazio dei nomi personalizzato
Dori

2
Nel passaggio 3, puoi semplicemente utilizzare String initialText = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "initialText");dove attr è il set di attributi passato nel costruttore e "initialText" è il nome dell'attributo personalizzato
kosiara - Bartosz Kosarzycki

21

Nella cartella res / values ​​creare attr.xml. Qui puoi definire i tuoi attributi:

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

Quando poi vuoi usarlo nel tuo file di layout devi aggiungere

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

e poi puoi usare il valore con customname:myCustomValue=""


questa non è la risposta, la domanda è come cambiare programmaticamente da java
Fazal,

-11

Sì, puoi usare solo <resource>tag.
come questo:

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

collegamento dal sito ufficiale


Grazie per la risposta. Ma nella risorsa, vedo l'utilizzo di valori predefiniti "android:". Il punto è, posso avere ad esempio android: phoneNameSelected = "true" come parametro del mio elemento dell'interfaccia utente personalizzato?
Waypoint
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.