2012-08-24 21 views
7

Siento que solía saber cómo hacer esto, pero actualmente estoy dibujando un espacio en blanco. Tengo una clase que se extiende desde Ver (Card) y escribí un diseño para ella en XML. Lo que quiero hacer es configurar la Vista de Card para que sea la Vista XML en el constructor, para que pueda usar los métodos en Card para establecer TextView sy otras cosas. ¿Alguna sugerencia? Código de abajo:¿Usar el diseño XML como vista para ver la subclase?

Card.java:. (he View.inflate(context, R.layout.card_layout, null); allí como un ejemplo de lo que quiero hacer, pero que no está funcionando Básicamente quiero la clase que sea la interfaz para la vista, y con el fin de hacer que necesito para asignar alguna manera el diseño de XML para la vista. ¿debo usar algo en la línea de setContentView(View view)? no hay tal método en la clase View, pero ¿hay algo parecido?)

public class Card extends View { 

    TextView tv; 

    public Card(Context context) { 
     super(context); 
     View.inflate(context, R.layout.card_layout, null); 
     tv = (TextView) findViewById(R.id.tv); 
    } 

    public Card(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     View.inflate(context, R.layout.card_layout, null); 
     tv = (TextView) findViewById(R.id.tv); 
    } 

    public Card(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     View.inflate(context, R.layout.card_layout, null); 
     tv = (TextView) findViewById(R.id.tv); 
    } 

    public void setText(String text) { 
     tv.setText(text); 
    } 

} 

card_layout. xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="336dp" 
    android:layout_height="280dp" 
    android:layout_gravity="center" 
    android:background="@drawable/card_bg" 
    android:orientation="vertical" > 


    <TextView 
     android:id="@+id/tv" 
     android:layout_height="fill_parent" 
     android:layout_width="wrap_content" 
     android:textSize="24dp" 
    /> 

</LinearLayout> 

Respuesta

10

Lo que estamos tratando de hacer no es posible con la configuración actual. Un View (o una subclase directa del mismo) representa una única vista que no tiene la noción de vistas secundarias, lo que estás tratando de hacer. No se puede usar el LayoutInflater con un simple View porque la clase simple View no tiene los métodos para agregar realmente el elemento secundario (como el método addView()).

Por otro lado, la clase correcta a utilizar para ser capaces de tener hijos es la ViewGroup (o una de las subclases directas como LinearLayout, FrameLayout etc) que aceptan la adición Views u otro ViewGroups a ella, mediante el suministro de la addView métodos. Al final de su clase debe ser:

public class Card extends ViewGroup { 

    TextView tv; 

    public Card(Context context) { 
     super(context); 
     View.inflate(context, R.layout.card_layout, this); 
     tv = (TextView) findViewById(R.id.tv); 
    } 

    public Card(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     View.inflate(context, R.layout.card_layout, this); 
     tv = (TextView) findViewById(R.id.tv); 
    } 

    public Card(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     View.inflate(context, R.layout.card_layout, this); 
     tv = (TextView) findViewById(R.id.tv); 
    } 

    public void setText(String text) { 
     tv.setText(text); 
    } 

} 

si recuerdo que tiene que anular onLayout si extiende ViewGroup, así que en vez (y debido a su archivo de paginación), usted debe buscar en extender LinearLayout y reemplazar el LinearLayout de el diseño xml con una etiqueta merge.

+0

Pensé en hacer que mi clase extendiera 'LinearLayout' y luego pensé que era una idea tonta.¡Lo intenté después de ver este comentario y funcionó perfectamente! ¡Muchas gracias! – roboguy12

3

Debería poder usar su nombre de clase en el diseño. Algo como:

<your.package.name.Card 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="336dp" 
    android:layout_height="280dp" 
    ... 

Simplemente llame al findViewById para obtener vistas secundarias.

Para usar su clase de Tarjeta, use el inflador para obtener una instancia y luego, adjúntela a una vista principal.

LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
Card card = (Card) inflater.inflate(R.layout.card_layout, null); 
parentView.addView(card); 

Have a look at the docs for more info.

+0

Pero, ¿cómo está conectado el 'card_layout.xml' a la clase' Card'? Cuando hago lo que escribiste arriba, no aparece nada. – roboguy12

+0

Miré los documentos y proporciona mucha información sobre cómo dibujar programáticamente una vista personalizada, pero nada sobre el uso de uno definido en XML. Podía dibujar todo usando métodos similares, pero tomaría un tiempo, ya que es un diseño bastante detallado. – roboguy12

+0

Necesitará agregar una instancia de 'Tarjeta' a otra vista que esté utilizando ya sea con' view.addView (card) 'o con' setContentView (card) 'para una actividad. – devnate

Cuestiones relacionadas