2010-03-09 26 views
34

ok,visualizzazione personalizzata con il layout

quello che sto cercando di fare è quello di incorporare una visualizzazione personalizzata nella main.xml layout di default:

<?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> 

come si può vedere la classe si chiama com. lam.customview.CustomDisplayView, con l'id di custom_display_view1.

ora nella classe com.lam.customview.CustomDisplayView, voglio utilizzare un altro layout chiamato custom_display_view.xml perché non desidero creare controlli/widget a livello di codice.

custom_display_view.xml è solo un pulsante e l'immagine, il cui contenuto voglio cambiare in base a determinate condizioni:

<?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> 

ho cercato di fare:

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

...

, ma ha ottenuto questo errore, "03-08 20: 33: 15.711: ERRORE/onCreate (10879): riga file binario XML n. 8: errore durante la generazione della classe 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); 

...

ma ottenuto questo errore, "03-08 20: 28: 47,401: ERRORE/CustomDisplayView (10806): Risorsa ID # 0x7f050002 tipo # 0x12 non è valido "

anche, se lo faccio in questo modo, come qualcuno ha suggerito, non è chiaro a me come th e custom_display_view.xml è associato alla classe di visualizzazione personalizzata.

grazie.

+0

Lingua? Struttura? –

+0

ciao ho lo stesso problema ... hai una soluzione ??? – Ads

risposta

0

Provare a utilizzare

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

si può gonfiare il cutom_display_view nella vostra classe personalizzata da:

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

Questo è molto più pulito: View.inflate (context, R.layout.myactionbar, this); – Ian

70

Ho avuto lo stesso problema esatto, e il problema era che stavo usando l'ID sbagliato. .. e sembra che tu sia anche tu.

Si dovrebbe essere fa riferimento

R.layout.custom_display_view

-non-

R.id.custom_display_view

+2

Risposta perfetta, ho avuto lo stesso problema e ho davvero aiutato –

0

linea # 8 è la visualizzazione personalizzata nel primo layout. Stai cercando di caricare il layout sbagliato, quindi sta tentando di caricarsi in modo ricorsivo?(Ho appena fatto la stessa cosa)

inoltre si ha:

R.layout.custom_display_view 

vs.

R.id.custom_display_view1 

con la sull'estremità lì ... che è?

4

Quando si gonfia il layout, è necessario passare un riferimento all'istanza della vista per identificarlo come root. Così, invece di chiamare:

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

chiamata:

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

See: The docs

+0

Puoi fornire altro codice per mostrare come funziona? –

+0

@Frank, il codice è simile a quello dell'OP. –

+0

Funziona solo se la classe personalizzata è un gruppo di vista – smac89

7

questo post del blog mi ha aiutato a capire cosa fare immensamente http://trickyandroid.com/protip-inflating-layout-for-your-custom-view/. Nel caso in cui il post scompare, qui ci sono alcune parti del codice:

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 questo layout:

<?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> 

Il controllo è incluso come:

<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> 

Dove com.trickyandroid .customview.app.view è lo spazio dei nomi della scheda di classe. Una cosa che per me era nuova era il tag "merge", che finisce per essere lo stesso nodo del tag Card nel documento contenente.

Problemi correlati