linearlayout custom android components custom-attributes uicomponents

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?