2010-01-20 6 views
52

Grrr ...de error hace referencia a una clase interna Vista en diseño/main.xml

creo una subclase de vista como una clase interna en mi actividad. Antes de simplemente vincular a esta vista de mi actividad con:

setContentView(new CustomView(this)); 

sin problemas.

Ahora, sin embargo, mi vista se está volviendo más compleja, por lo que la hago parte de un FrameLayout para poder hacer de esta la vista base y agregar un widget Spinner encima. El problema es que cuando hago esto me da un error:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.grafightscratch.ochemmer/com.grafightscratch.ochemmer.MoleculeTablet}: android.view.InflateException: Binary XML file line #4: Error inflating class com.grafightscratch.ochemmer.MoleculeTablet.MoleculeTabletView 
... 
Caused by: android.view.InflateException: Binary XML file line #4: Error inflating class com.grafightscratch.ochemmer.MoleculeTablet.MoleculeTabletView 
... 
Caused by: java.lang.ClassNotFoundException: com.grafightscratch.ochemmer.MoleculeTablet.MoleculeTabletView in loader [email protected] 

So- este punto de vista trabajaba antes, cuando he vinculado a ella directamente, pero cuando traté de añadir en el archivo main.xml como parte de una framelayout Obtuve el error anterior. También intenté poner en un diseño con solo que se muestra a través de:

<com.grafightscratch.ochemmer.MoleculeTablet.MoleculeTabletView 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/molecule_tablet_view" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
/> 

Nada funciona. Sigo recibiendo los errores InflateException/ClassNotFoundException. Se queja de la "línea n. ° 3" en el archivo XML binario, y si está hablando de main.xml, es la declaración del paquete que he comprobado tres veces.

EDIT Intenté hacer de esta vista una clase separada (es decir, no una clase interna) y funciona. Después de buscar en torno he encontrado algunos mensajes diciendo que la etiqueta XML debe tener este aspecto:

<com.grafightscratch.ochemmer.MoleculeTablet$MoleculeTabletView ...> 

Es decir, un signo de dólar se debe utilizar para separar el innerclass de la clase principal. Sin embargo, Eclipse detecta esto, lo llama un error y se niega a permitirme compilar o implementar con ese personaje allí. Entonces, ahora la pregunta es: ¿cómo se hace referencia a una Vista que es una clase interna?

Respuesta

146

Para las clases internas de la sintaxis se convierte en:

<view class="com.grafightscratch.ochemmer.MoleculeTablet$MoleculeTabletView" /> 

La razón es que $ es un carácter ilegal en las etiquetas XML.

+5

Solo una nota aquí, la etiqueta xml puede necesitar estar "más cerca" de su clase que la etiqueta 'Ver' (en mi caso necesitaba un' ViewGroup') –

+0

Aunque no obtengo un error, cuando obtengo la vista (usando findViewById), obtengo una instancia de 'android.view.View', no una instancia de la clase interna. ¿Lo que da? – yoaquim

+4

Asegúrese de que la etiqueta de vista xml esté en minúsculas, entonces debería poder convertirla a la clase que especificó – wkarl

0

Debe especificar el nombre completo de su clase de vista en el XML para que la inflación funcione y la clase de visualización sea encontrada por el Runtime System.
Puesto que usted ha declarado su Ver como clase interna de su actividad en el nombre completo sería: <your_package_name>.OuterClassName.InnerClassName

¿Seguro com.grafightscratch.ochemmer.CustomView es el nombre completo de su clase?

EDIT: Gracias por recordarme esto. Cuando las vistas se declaran como clases anidadas, existe una ligera aberración, consulte Use Custom component de este documento.

+0

Ahhhh ... me atrapó, estaba intentando editar esta publicación para mayor claridad y solo terminé introduciendo un "error de publicación". OK- Solo voy a cortar y pegar para que refleje el código real. – IcedDante

+0

Bien, la pregunta ahora refleja los nombres reales del paquete. Pero sí, sigue siendo un problema. – IcedDante

+0

Consulte la sección "Usar componentes personalizados" en esta página: http://developer.android.com/intl/fr/guide/topics/ui/custom-components.html#modifying – Samuh

2
<view xmlns:android="http://schemas.android.com/apk/res/android" 
    class="com.example.Myproject.Myactivity$Myview" 
    android:layout_width="fill_parent" android:id="@+id/name" android:visibility="visible" android:layout_gravity="bottom" android:layout_height="fill_parent" android:focusableInTouchMode="true" 
/> 

este código funcionó para mí. Cuando dejé algunos de los elementos como layout_width, mi programa se bloqueó. También tuve que hacer mi clase de vista estática para que funcione. Al final hubiera sido lo mismo si lo hubiera sacado de su nido. El ejemplo de nota de Android usa una clase anidada.

36

Estaba teniendo el mismo problema. Sin embargo, la sintaxis en el archivo XML era correcta.

Lo que terminó resolviendo el problema para mí fue que la clase interna debe declararse como estática. Por ejemplo:

public static class myWebView extends WebView 
+1

¡Thnx para obtener este importante consejo! – Skip

+0

Lo mismo aquí. La palabra clave estática perdida era mi problema también. –

11

de clase interna:

<view class="{package}.{ParentClass}${innerClass}" /> 

y para la clase interna, debe declarar su clase:

public static InnerClass 

static es requiere.

1

Éstos son algunos puntos clave para hacer una vista personalizada dentro de una clase interna ...

El diseño debe ser la siguiente: Clase

<view class = ".MainClass$SubClassView" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:id="@+id/button"/> 

Java

  • estático es requerido
  • Se requiere constructor con AttributeSet (al menos uno)

archivo XML

  • vista etiqueta (con minúsculas NO VER) se requiere
  • etiqueta de clase con la ruta para su clase interna, usando
  • $ en lugar de "." antes de su nombre SubClassView
+1

Gracias por señalar la minúscula a la vista – Jello

Cuestiones relacionadas