Sim. Guia resumido:
1. Crie um atributo XML
Crie um novo arquivo XML dentro /res/values/attrs.xml
, com o atributo e seu tipo
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<declare-styleable name="MyCustomElement">
<attr name="distanceExample" format="dimension"/>
</declare-styleable>
</resources>
Basicamente, você deve configurar um <declare-styleable />
para sua visualização que contenha todos os seus atributos personalizados (aqui apenas um). Nunca encontrei uma lista completa dos tipos possíveis, então você precisa procurar na fonte, eu acho. Tipos que eu conheço são referência (para outro recurso), cor, booleano, dimensão, flutuante, inteiro e string . Eles são bastante autoexplicativos
2. Use os atributos em seu layout
Isso funciona da mesma maneira que você fez acima, com uma exceção. Seu atributo personalizado precisa de seu próprio namespace 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"
/>
Bem direto.
3. Faça uso dos valores que você passar
Modifique o construtor de sua visualização personalizada para analisar os valores.
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
é uma variável de membro privado neste exemplo. TypedArray
tem muitas outras coisas para analisar outros tipos de valores.
E é isso. Use o valor analisado em seu View
para modificá-lo, por exemplo, use-o em onDraw()
para alterar a aparência de acordo.