2010-07-15 24 views
14

He creado mi propia vista creando una subclase de la clase SurfaceView.Vista personalizada en el diseño xml

Sin embargo, no puedo encontrar la manera de agregarlo desde el archivo de diseño xml. Mi main.xml actual se ve así:

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

¿Qué me he perdido?

Editar

Más información

Mi punto de vista es el siguiente

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

y funciona bien como esto:

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

Pero no pasa nada cuando se trata de usarlo desde el xml

Respuesta

17

que desee:

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

Editar:

Después de ver el resto de su código que probablemente tirar porque no se puede llamar getHolder en el constructor, mientras se infla. Mueva que a View#onFinishInflate

Así:

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

Si eso no funciona, trate de poner que en una función init que llame en su Activity s onCreate después setContentView.

Probablemente estaba funcionando antes porque al inflar desde xml se llama al constructor: View(Context, AttributeSet) en lugar de View(Context).

+0

Con mi primer diseño Acabo de recibir una pantalla en negro, con esto la aplicación se cuelga en su lugar. – monoceres

+0

¿Cuál fue el seguimiento de la pila? – Qberticus

+0

http://pastebin.com/u2t3jdMt – monoceres

11

Lo que te perdiste en tu ejemplo fue el nombre de la etiqueta, se suponía que era "ver" (primero que no era capital) y no "Ver". Aunque puede poner su nombre de clase como el nombre de la etiqueta la mayoría de las veces, es imposible hacerlo si su clase es de clase interna, porque el símbolo "$", que se usa en Java para referenciar las clases internas, está restringido en etiquetas XML. lo tanto, si desea utilizar la clase interna en su XML debe escribir así:

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

Lo que pasa es que tanto "vista" y las etiquetas "Ver" existen en el esquema. La etiqueta "View" (comenzada con una letra mayúscula) generará una clase View, mientras que la etiqueta "view", cuando se analice, examinará el atributo class.

+1

OMG ¡Te amo hombre (de una manera estrictamente no platónica)! – samosaris

+0

@SamusArin +1 para amarlo jaja –

+0

Recuerde agregar TODOS los constructores. Si está reemplazando a View, hay 3 constructores: View (Contexto), View (Contexto de contexto, AttributeSet attrs) y View (Contexto de contexto, AttributeSet attrs, int defStyleAttr) – SoloPilot

Cuestiones relacionadas