type studio gridlayout examples ejemplo definicion android layout view

studio - view android definicion



Error al hacer referencia a una clase interna Ver en layout/main.xml (6)

Grrr ...

Creo una subclase de vista como una clase interna en mi Actividad. Antes simplemente vinculaba esta vista desde mi actividad con:

setContentView(new CustomView(this));

sin problemas.

Ahora, sin embargo, mi vista se está volviendo más compleja, así que la estoy haciendo parte de un FrameLayout para que pueda hacer que esta sea la vista base y agregar un widget Spinner encima. El problema es que cuando hago esto obtengo 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 dalvik.system.PathClassLoader@43b74a28

Entonces, esta vista funcionaba antes cuando la enlazaba directamente, pero cuando intenté agregarla en el archivo main.xml como parte de un framelayout, recibí el error anterior. También traté de poner en un diseño con solo mostrarlo 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.

EDITAR Traté de hacer de esta vista una clase separada (es decir, no una clase interna) y funciona. Después de buscar un poco, encontré algunas publicaciones que decían que la etiqueta xml debería verse así:

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

Es decir, se debe usar un signo de dólar para separar la clase interna 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?


Aquí hay algunos puntos clave para hacer una vista personalizada dentro de una clase interna ...

public static class MainClass { .... .... public class SubClassView extends LinearLayout { public SubClassView(Context context, AttributeSet attrs) { super(context, attrs); ..... } .... .... } }

El diseño debe ser el siguiente:

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

Clase de Java

  • estática es requerida
  • constructor con AttributeSet es obligatorio (al menos uno)

Archivo XML

  • Se requiere etiqueta de vista (con minúscula NO vista)
  • etiqueta de clase con la ruta a su clase interna, usando
  • $ en lugar de "." antes de tu nombre SubClassView

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 que se encuentra en el sistema de tiempo de ejecución.
Como ha declarado su Vista como clase interna de su actividad, el nombre completo será: <your_package_name>.OuterClassName.InnerClassName

¿Estás seguro de que com.grafightscratch.ochemmer.CustomView es el nombre completo de tu clase?

EDITAR: Gracias por recordarme esto. Cuando las vistas se declaran como clases anidadas, existe una ligera aberración, consulte Uso del componente personalizado de este documento.


Para las clases internas, 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.


Yo 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


para la clase interna:

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

y para la clase interna, debes declarar tu clase:

public static InnerClass

static es requerido


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