android - custom - Cómo pasar parámetros de componentes personalizados en java y xml
set layout to view android (1)
(Revelación completa: esta pregunta es una consecuencia de la creación de una vista personalizada )
Puede crear constructores más allá de los tres estándares heredados de la View
que agregan los atributos que desea ...
MyComponent(Context context, String foo)
{
super(context);
// Do something with foo
}
... pero no lo recomiendo. Es mejor seguir la misma convención que otros componentes. Esto hará que su componente sea lo más flexible posible y evitará que los desarrolladores que lo usan se rasguen el cabello porque el suyo no es consistente con todo lo demás:
1. Proporcionar getters y setters para cada uno de los atributos:
public void setFoo(String new_foo) { ... }
public String getFoo() { ... }
2. Defina los atributos en res/values/attrs.xml
para que puedan usarse en XML.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyComponent">
<attr name="foo" format="string" />
</declare-styleable>
</resources>
3. Proporcionar los tres constructores estándar de la View
.
Si necesita seleccionar algo de los atributos en uno de los constructores que toma un AttributeSet
, puede hacer ...
TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.MyComponent);
CharSequence foo_cs = arr.getString(R.styleable.MyComponent_foo);
if (foo_cs != null) {
// Do something with foo_cs.toString()
}
arr.recycle(); // Do this when done.
Con todo lo hecho, puede crear MyCompnent
instancia de MyCompnent
programación ...
MyComponent c = new MyComponent(context);
c.setFoo("Bar");
... o vía XML:
<!-- res/layout/MyActivity.xml -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:blrfl="http://schemas.android.com/apk/res-auto"
...etc...
>
<com.blrfl.MyComponent
android:id="@+id/customid"
android:layout_weight="1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
blrfl:foo="bar"
blrfl:quux="bletch"
/>
</LinearLayout>
Al crear un componente personalizado en Android, a menudo se le pregunta cómo crear y pasar la propiedad attrs al constructor.
A menudo se sugiere que al crear un componente en Java, simplemente use el constructor predeterminado, es decir,
new MyComponent(context);
en lugar de intentar crear un objeto attrs para pasar al constructor sobrecargado que a menudo se ve en componentes personalizados basados en xml. He intentado crear un objeto de atributos y no parece fácil ni del todo posible (sin un proceso extremadamente complicado), y por todas las cuentas no es realmente necesario.
Mi pregunta es entonces: ¿cuál es la forma más eficiente de construir un componente personalizado en java que pase o establezca las propiedades que de otra forma habría establecido el objeto attrs al inflar un componente usando xml?