Vista personalizada con diseño

De acuerdo,

Lo que estoy tratando de hacer es incrustar una vista personalizada en el diseño por defecto 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 se 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 sólo 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> 

Traté de 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 recibió este error, "03-08 20: 33: 15.711: ERROR / onCreate (10879): Archivo XML binario línea # 8: Error de inflar 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 recibió este error "03-08 20: 28: 47.401: ERROR / CustomDisplayView (10806): Resource ID # 0x7f050002 tipo # 0x12 no es válido"

También, si lo hago de esta manera, como alguien ha sugerido, no está claro para mí cómo el custom_display_view.xml está asociado con la clase de vista personalizada.

Gracias.

Tuve exactamente el mismo problema, y ​​el problema era que estaba usando el ID equivocado … y parece que eres demasiado.

Debería estar haciendo referencia a

R.layout.custom_display_view

-no-

R.id.custom_display_view

Puede inflar el cutom_display_view en su clase personalizada:

 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); } } 

Esta entrada del 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, he aquí 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 esta disposición:

 <?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 se incluye 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 tarjeta de clase. Una cosa que era nueva para mí era el "merge" etiqueta, que termina siendo el mismo nodo que la etiqueta de la tarjeta en el documento que contiene.

Cuando infla su diseño, debe pasar una referencia a la instancia de vista para identificarla como la raíz. Así que en lugar de llamar a:

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

Llamada:

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

Ver: Los documentos

La línea # 8 es su vista personalizada en el primer diseño. ¿Está intentando cargar el diseño incorrecto, por lo que está tratando de cargar recursivamente? (Acabo de hacer lo mismo)

También tienes:

  R.layout.custom_display_view 

Vs

  R.id.custom_display_view1 

Con el 1 en el extremo allí … cuál es él?

Intenta usar

 context.getLayoutInflater().inflate( R.id.custom_display_view1, null ); 
  • Uso de Javascript en la vista web
  • Opuesto de setContentView
  • ¿Cómo puedo pasar variables extra durante una búsqueda invocada por un SearchView / Widget?
  • Método recomendado para presentar texto con formato en Android?
  • Ver paginador androide con imagen de fondo único
  • Obtener las dimensiones después de setLayoutParams en Android
  • GridView getChildAt () devuelve null
  • Android: Layout.addView () no funciona
  • Cómo ver un Google Calendar público a través de una aplicación para Android
  • Ocultar búsqueda / ir botón en el teclado virtual cuando se utiliza la búsqueda?
  • Deslizar a otra vista en recyclerVer con ItemTouchHelper
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.