2011-05-05 29 views
14

Tengo y la idea sobre cómo crear un control personalizado aquí: Android interface - need suggestions on what widgets to useDiseño de inflado en control personalizado: ¿cómo?

¿Cómo hago el mismo, pero la creación de diseño de control en XML y simplemente inflar en el código? No me gusta en este ejemplo en el que tengo que crear cada control manualmente.

Mi primer problema es que LinearLayout que se usa como base no admite el comando setView(). ¿Debo extender algo más?

EDIT: He encontrado Este: http://developer.android.com/guide/topics/ui/custom-components.html y esto: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List4.html

Parece que necesito compuesto de control. Solo necesito un poco de código. ¿Cómo infló el contenido del control desde XML? ¿El artículo y la muestra BOth dicen que puedo pero CÓMO?

Respuesta

22

usted tiene que utilizar un diseño de la siguiente manera:

<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android"> 
    <View android:layout_width="fill_parent" 
    android:layout_height="0px" 
    android:layout_weight="1" 
    android:background="#0F0"/> 
    <View android:layout_width="fill_parent" 
    android:layout_height="0px" 
    android:layout_weight="1" 
    android:background="#0FF"/> 
</merge> 

donde <merge> significa "poner todo lo que hay dentro de mí al padre que voy a ser inflado a".

Luego, en código:

public class CControl extends LinearLayout { 

    public CControl(Context context) { 
     this(context, null); 
    } 

    public CControl(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     inflater.inflate(R.layout.tryout, this); 
    } 
    // ...... 
} 

En este punto se puede usar el mando compuesto como si es un LinearLayout, por lo que tendrá que especificar en el diseño exterior si se quiere que sea vertical, para ejemplo, o puede establecerlo como predeterminado dentro del constructor.

+0

Eso es un evento mejor. ¿Qué sucede si no quiero que LinearLayout sea la base? ¿Debo extender View? Estoy buscando el contenedor más ligero posible para mi control compuesto. Lo insertaré en Actividad con LinearLayout de todos modos, así que no necesito otro nivel de nido. – katit

+0

@katit: ampliaría View si estoy creando una vista completamente nueva, dibujando todo en onDraw(). Necesita un diseño para un control compuesto, ya que debe ser una unidad reutilizable de alguna manera, y la elección depende principalmente de cómo quiera diseñar las vistas de los niños. No me preocuparía demasiado acerca de la optimización, a menos que muestre cientos de estos (lo que sería malo de todos modos). – bigstones

+0

Lo tengo. No mostraré hambrientos. Por lo general, 2-3 quizás 4. Me gusta aprender de la mejor manera desde el principio. Pero aquí parece que usar el diseño estará bien. – katit

Cuestiones relacionadas