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

Ice*_*nte 56 layout android view

哎呀...

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

setContentView(new CustomView(this));
Run Code Online (Sandbox Code Playgroud)

没有问题.

然而,现在,我的视图变得越来越复杂,所以我将它作为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
Run Code Online (Sandbox Code Playgroud)

所以这个视图在我直接链接到它之前有效,但是当我尝试将它作为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"
/>
Run Code Online (Sandbox Code Playgroud)

什么都行不通.我一直收到InflateException/ClassNotFoundException错误.它抱怨二进制XML文件中的"第3行",如果它正在讨论main.xml,那就是我已经三次检查的包声明.

编辑 我试图使这个视图成为一个单独的类(即 - 不是内部类),它的工作原理.经过一番搜索,我发现一些帖子说xml标签应该是这样的:

<com.grafightscratch.ochemmer.MoleculeTablet$MoleculeTabletView ...>
Run Code Online (Sandbox Code Playgroud)

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

Rom*_*Guy 152

对于内部类,语法变为:

<view class="com.grafightscratch.ochemmer.MoleculeTablet$MoleculeTabletView" />
Run Code Online (Sandbox Code Playgroud)

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

  • 只需注意,xml标签可能需要比"View"标签"更接近"您的类(在我的情况下,我需要一个`ViewGroup`) (5认同)
  • 确保xml视图标记是小写,然后您应该能够将它强制转换为您指定的类 (4认同)
  • 不幸的是,如果您想将您的类包含在“PreferenceScreen” XML 布局中,则此答案不起作用。你得到`java.lang.ClassNotFoundException:没有找到类“android.preference.view”`。我发现解决此问题的唯一方法是将静态嵌套类提升为自己文件中的成熟类,这并不理想。另见 http://stackoverflow.com/q/7249028/1843329 (2认同)

小智 39

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

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

public static class myWebView extends WebView
Run Code Online (Sandbox Code Playgroud)


Adn*_*aki 11

对于内部阶级:

<view class="{package}.{ParentClass}${innerClass}" />
Run Code Online (Sandbox Code Playgroud)

对于内部课程,您必须申报您的课程:

public static InnerClass
Run Code Online (Sandbox Code Playgroud)

static 是必需的.