哎呀...
我在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?
答案 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类
XML文件
答案 5 :(得分:0)
您需要在XML中指定视图类的完全限定名称以使通胀工作,并在运行系统中找到View Class。
由于您已将View视为活动的内部类,因此完全限定名称为:<your_package_name>.OuterClassName.InnerClassName
您确定com.grafightscratch.ochemmer.CustomView
是您班级的完全限定名称吗?