studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android layout view

android - programacion - vista personalizada con diseño



manual de programacion android pdf (6)

De acuerdo,

Lo que intento hacer es insertar una vista personalizada en el diseño predeterminado main.xml:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <com.lam.customview.CustomDisplayView android:id="@+id/custom_display_view1" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:id="@+id/prev" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="50" android:textAppearance="?android:attr/textAppearanceSmall" android:text="@string/prev" /> </LinearLayout> </LinearLayout>

como puede ver, la clase se llama com.lam.customview.CustomDisplayView, con el id de custom_display_view1.

ahora en la clase com.lam.customview.CustomDisplayView, quiero usar otro diseño llamado custom_display_view.xml porque no quiero crear controles / widgets mediante programación.

custom_display_view.xml es solo un botón y una imagen, cuyo contenido quiero cambiar en función de ciertas condiciones:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/display_text_view1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <ImageView android:id="@+id/display_image_view1" android:layout_width="wrap_content" android:layout_height="wrap_content"> </ImageView> </LinearLayout>

intenté hacer:

1)

public CustomDisplayView(Context context, AttributeSet attrs) { super(context, attrs); try { // register our interest in hearing about changes to our surface SurfaceHolder holder = getHolder(); holder.addCallback(this); View.inflate(context, R.layout.custom_display_view, null);

...

pero obtuve este error, "03-08 20: 33: 15.711: ERROR / onCreate (10879): archivo XML binario línea # 8: error inflando la clase java.lang.reflect.Constructor".

2)

public CustomDisplayView(Context context, AttributeSet attrs) { super(context, attrs); try { // register our interest in hearing about changes to our surface SurfaceHolder holder = getHolder(); holder.addCallback(this); View.inflate(context, R.id.custom_display_view1, null);

...

pero obtuve este error, "03-08 20: 28: 47.401: ERROR / CustomDisplayView (10806): ID de recurso # 0x7f050002 tipo # 0x12 no es válido"

Además, si lo hago de esta manera, como alguien sugirió, no está claro cómo se asocia el custom_display_view.xml con la clase de vista personalizada.

Gracias.


Cuando infle su diseño, debe pasar una referencia a la instancia de vista para identificarlo como la raíz. Entonces, en lugar de llamar:

View.inflate(context, R.layout.custom_display_view, null);

Llamada:

View.inflate(context, R.layout.custom_display_view, this);

Ver: los documentos


Esta publicación de blog me ayudó a entender qué hacer inmensamente http://trickyandroid.com/protip-inflating-layout-for-your-custom-view/ . En caso de que la publicación del blog desaparezca, aquí hay algunas partes del código:

public class Card extends RelativeLayout { public Card(Context context) { super(context); init(); } public Card(Context context, AttributeSet attrs) { super(context, attrs); init(); } public Card(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } private void init() { inflate(getContext(), R.layout.card, this); } }

con este diseño:

<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="@dimen/card_padding" android:background="@color/card_background"> <ImageView ... /> <TextView ... /> </merge>

El control está incluido como:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin"> <com.trickyandroid.customview.app.view.Card android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@color/card_background" android:padding="@dimen/card_padding"/> </FrameLayout>

Donde com.trickyandroid.customview.app.view es el espacio de nombres de la clase de la tarjeta. Una cosa que era nueva para mí era la etiqueta "merge", que termina siendo el mismo nodo que la etiqueta de la tarjeta en el documento que contiene.


Intenta usar

context.getLayoutInflater().inflate( R.id.custom_display_view1, null );


La línea n.º 8 es su vista personalizada en el primer diseño. ¿Estás intentando cargar el diseño incorrecto, por lo que está intentando cargarse recursivamente? (Acabo de hacer la misma cosa)

también tienes:

R.layout.custom_display_view

vs.

R.id.custom_display_view1

con el 1 al final ... ¿cuál es?


Puede inflar cutom_display_view en su clase personalizada de la siguiente manera:

public CustomDisplayView(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if(inflater != null){ inflater.inflate(R.layout.custom_display_view, this); } }


Tenía exactamente el mismo problema, y ​​el problema era que estaba usando la identificación incorrecta ... y parece que tú también.

Deberías estar haciendo referencia

R.layout.custom_display_view

-no-

R.id.custom_display_view