引用layout / main.xml中的内部类View时出错

时间:2010-01-20 00:44:47

标签: android layout view

哎呀...

我在Activity中创建了一个视图的子类作为内部类。之前我只是通过我的活动链接到此视图:

setContentView(new CustomView(this));

没问题。

然而,现在,我的视图变得越来越复杂,所以我将它作为FrameLayout的一部分,这样我就可以将它作为基本视图并在其上添加一个Spinner小部件。问题是,当我这样做时,我收到一个错误:

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

所以 - 这个视图在我直接链接到它之前有效,但是当我尝试将它作为framelayout的一部分添加到main.xml文件中时,我得到了上述错误。我也尝试通过以下方式进入布局:

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

没有任何作用。我一直收到InflateException / ClassNotFoundException错误。它抱怨二进制XML文件中的“第3行”,如果它正在讨论main.xml,那就是我已经三次检查的包声明。

修改 我尝试将这个视图作为一个单独的类(即 - 不是内部类)并且它有效。经过一番搜索,我发现一些帖子说xml标签应该是这样的:

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

即,应使用美元符号将内部类与主类分开。但是,Eclipse barfs就此称之为错误,并拒绝让我在那里构建或部署该角色。所以现在问题变成了:如何引用一个内部类的View?

6 个答案:

答案 0 :(得分:150)

对于内部类,语法变为:

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

原因是$是XML标签中的非法字符。

答案 1 :(得分:39)

我遇到了同样的问题。但是,XML文件中的语法是正确的。

最终为我解决问题的是内部类需要声明为静态。例如:

public static class myWebView extends WebView

答案 2 :(得分:11)

内部课程

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

对于内部类,您必须声明您的类:

public static InnerClass

static 是必需的。

答案 3 :(得分: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"
/>

这段代码对我有用。当我遗漏了一些像layout_width这样的元素时,我的程序崩溃了。我还必须使我的视图类静态,以使其工作。最后,如果我把它从巢中取出,那将是一样的。 android注释示例使用嵌套类。

答案 4 :(得分:1)

以下是在内部类中创建自定义视图的一些关键点...

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

布局应如下:

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

Java类

  • 静态是必需的
  • 需要具有AttributeSet的
  • 构造函数(至少一个)

XML文件

  • 查看标记(小写NOT视图)是必需的
  • 类标记,包含内部类的路径,使用
  • $ 而不是&#34;。&#34;在您的SubClassView名称之前

答案 5 :(得分:0)

您需要在XML中指定视图类的完全限定名称以使通胀工作,并在运行系统中找到View Class。 由于您已将View视为活动的内部类,因此完全限定名称为:<your_package_name>.OuterClassName.InnerClassName

您确定com.grafightscratch.ochemmer.CustomView是您班级的完全限定名称吗?

编辑:谢谢你提醒我这件事。当视图声明为嵌套类时,会出现轻微的异常,请参阅本文档的Use Custom component