在layout / main.xml中引用内部类View的错误

哎呀…

我在Activity中创build一个视图的子类作为内部类。 在我把这个观点与我的活动简单地联系起来之前:

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,这是我已经三重检查的包声明。

编辑我试图使这个看法一个单独的类(即 – 不是内部类),它的工作原理。 经过一番search,我发现一些post说,XML标签应该是这样的:

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

也就是说,美元符号应该被用来把内部阶层和主要阶层分开。 不过,Eclipse的barf在这里称之为错误,并拒绝让我在那里build立或部署那个angular色。 所以现在问题变成:如何引用一个视图是一个内部类?

对于内部类,语法变成:

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

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

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

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

 public static class myWebView extends WebView 

对于内部类:

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

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

 public static InnerClass 

static是必需的。

 <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 note示例使用嵌套类。

您需要在XML中指定您的视图类的完全限定名称以使通货膨胀起作用,并且可以通过运行系统findView Class。
由于您已将视图声明为活动的内部类,因此完全限定名称将为: <your_package_name>.OuterClassName.InnerClassName

你确定com.grafightscratch.ochemmer.CustomView是你class级的完全限定名吗?

编辑:谢谢你提醒我。 当视图被声明为嵌套类时,会有一些微小的差异,请参阅使用此文档的自定义组件 。

以下是在内部类中进行自定义视图的一些要点…

 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的构造函数是必需的(至less有一个)

XML文件

  • 查看标签(小写NOT查看)是必需的
  • 类标签与你的内部类的path,使用
  • $而不是“”。 在您的SubClassView名称之前