2010-07-15 16 views
14

Ho creato la mia vista creando una sottoclasse della classe SurfaceView.Vista personalizzata nel layout xml

Tuttavia non riesco a capire come aggiungerlo dal file di layout xml. Il mio file main.xml attuale è il seguente:

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

<View 
    class="com.chainparticles.ChainView" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    /> 


</LinearLayout> 

Cosa mi è sfuggito?

Modifica

Maggiori informazioni

mio punto di vista è simile al seguente

package com.chainparticles; 
public class ChainView extends SurfaceView implements SurfaceHolder.Callback { 
    public ChainView(Context context) { 
     super(context); 
     getHolder().addCallback(this); 
    } 
// Other stuff 
} 

E funziona bene così:

ChainView cview = new ChainView(this); 
setContentView(cview); 

Ma non succede nulla quando si cerca di usarlo da l'xml.

risposta

17

desiderato:

<?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.chainparticles.ChainView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
    /> 
</LinearLayout> 

Edit:

Dopo aver visto il resto del codice è probabilmente buttare perché non si può chiamare getHolder nel costruttore mentre viene gonfiato. Spostare che per View#onFinishInflate

Quindi:

@Override 
protected void onFinishInflate() { 
    getHolder().addCallback(this); 
} 

Se questo non funziona prova a mettere che in una funzione init che chiamate nel vostro Activity s onCreate dopo setContentView.

Probabilmente funzionava prima perché quando si gonfia da xml il costruttore: View(Context, AttributeSet) viene chiamato anziché View(Context).

+0

Con il mio primo layout ho appena ricevuto uno schermo nero, con questo l'app si blocca invece. – monoceres

+0

qual era la traccia dello stack? – Qberticus

+0

http://pastebin.com/u2t3jdMt – monoceres

11

Quello che ti sei perso nel tuo esempio era il nome del tag, doveva essere "vista" (prima non maiuscola) non "Vista". Sebbene sia possibile inserire il nome della classe come nome del tag per la maggior parte del tempo, è impossibile farlo se la classe è di classe interna, poiché il simbolo "$", utilizzato in Java per fare riferimento alle classi interne, è limitato nei tag XML. Quindi, se si desidera utilizzare classe interna nella vostra XML si dovrebbe scrivere in questo modo:

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

    <view 
     class="com.chainparticles.Foo$InnerClassChainView" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
    /> 
</LinearLayout> 

Il fatto è che sia "vista" e "Visualizza " tag esistono nello schema. Il tag "View" (iniziato con maiuscola) genererà una classe View, mentre il tag "view", se analizzato, esaminerà l'attributo class.

+1

OMG Ti amo uomo (in modo rigorosamente non platonico)! – samosaris

+0

@SamusArin +1 per amore lui haha ​​ –

+0

Ricordarsi di aggiungere TUTTI i costruttori. Se stai sovrascrivendo View, ci sono 3 costruttori: View (Contesto contesto), View (Contesto contesto, AttributeSet attrs) e View (Contesto contesto, AttributeSet attrs, int defStyleAttr) – SoloPilot

Problemi correlati