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:
- Android: Redibujar una vista específica dentro de un diseño
- El método getDrawingCache () de Android 2.1 View devuelve siempre null
- Error de IndexOutOfBoundsException de Android para la vista de lista de filtros de búsqueda
- Android: ¿Cómo crear una vista personalizada modal?
- GridLayout empuja a sus hijos y desbordamiento cuando se le da fill_parent para la altura
<?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.
- Diseño de Android con visibilidad GONE
- Cambiar el tamaño de un mapa de bits a un valor fijo, pero sin cambiar la relación de aspecto
- Cómo mover un contenido de diseño fuera de la pantalla de Android
- Android SearchView cadena vacía
- Android SurfaceView no muestra onDraw
- Animar el cambio de color de fondo de la vista en Android
- Vista de superficie como un mapa de bits en android
- Vista personalizada de Android onMease onDraw lifecycle
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 );
- Android Virtual Device (AVD) – ¿qué CPU / ABI debo seleccionar?
- Cómo resaltar el elemento seleccionado de Recycler View?