2010-03-09 19 views
34

bien,vista personalizada con el diseño

lo que estoy tratando de hacer es la de insertar una vista personalizada en el main.xml diseño predeterminado:

<?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, el contenido de las cuales quiero cambiar sobre la base 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> 

que 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 obtuve este error, "03-08 20: 33: 15.711: ERROR/onCreate (10879): archivo XML binario línea # 8: error al 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 tiene este error ", 03-08 20: 28: 47.401: ERROR/CustomDisplayView (10806): Identificación de recursos # 0x7f050002 tipo # 0x12 no es válido "

también, si lo hago de esta manera, como alguien ha sugerido, no es claro cómo º e custom_display_view.xml está asociado a la clase de vista personalizada.

gracias.

+0

Idioma? ¿Marco de referencia? –

+0

hola tengo el mismo problema ... ¿tienes alguna solución? – Ads

Respuesta

0

Intente utilizar

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

Usted puede inflar el cutom_display_view en su clase personalizada por:

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

Esto es mucho más limpio: View.inflate (context, R.layout.myactionbar, this); – Ian

70

que tenían el mismo problema exacto, y el problema era que yo estaba usando el ID de mal. .. y parece que tú también lo eres.

Debería estar haciendo referencia a

R.layout.custom_display_view

-not-

R.id.custom_display_view

+2

Respuesta perfecta, equivocadamente tuve el mismo problema y esto realmente me ayudó –

0

línea # 8 es la 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 tiene:

R.layout.custom_display_view 

vs

R.id.custom_display_view1 

con el en el extremo allí ... ¿cuál es?

4

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

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

Llamar:

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

Ver: The docs posterior

+0

¿Puede proporcionar más código para mostrar cómo funciona esto? –

+0

@Frank, el código es similar al del OP. –

+0

Esto solo funciona si la clase personalizada es un grupo de vista – smac89

7

Este blog me ayudó a entender qué hacer inmensamente http://trickyandroid.com/protip-inflating-layout-for-your-custom-view/. En caso de que la entrada en el blog desaparece, 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 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> 

Dónde 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.

Cuestiones relacionadas