在xml布局中自定义视图

我通过创buildSurfaceView类的子类创build了自己的视图。

不过,我不知道如何从XML布局文件中添加它。 我目前的main.xml如下所示:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <View class="com.chainparticles.ChainView" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> 

我错过了什么?

编辑

更多信息

我的观点看起来像这样

 package com.chainparticles; public class ChainView extends SurfaceView implements SurfaceHolder.Callback { public ChainView(Context context) { super(context); getHolder().addCallback(this); } // Other stuff } 

它的工作正常,如下所示:

 ChainView cview = new ChainView(this); setContentView(cview); 

但是,尝试从xml使用它时没有任何反应。

Solutions Collecting From Web of "在xml布局中自定义视图"

你要:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <com.chainparticles.ChainView android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> 

编辑:

看到你的代码的其余部分后,可能会抛出,因为你不能在充气时在构造函数中调用getHolder 。 将其移动到View#onFinishInflate

所以:

 @Override protected void onFinishInflate() { getHolder().addCallback(this); } 

如果这不起作用,请尝试将其放入一个init函数中,该函数在setContentView之后在Activity的onCreate中调用。

这可能是以前的工作,因为从xml的构造函数膨胀时: View(Context, AttributeSet)被调用,而不是View(Context)

你在示例中错过的是标签名称,它应该是“查看”(第一个非首都)而不是“查看”。 尽pipe大部分时候都可以将类名称作为标签名称,但如果您的类是内部类,则不可能这样做,因为在Java中用于引用内部类的“$”符号在XML标签中受到限制。 所以,如果你想在你的XML中使用内部类,你应该这样写:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <view class="com.chainparticles.Foo$InnerClassChainView" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> 

事情是在模式中存在“ 视图 ”和“ 视图 ”标签。 “ View ”标签(以大写字母开头)将生成一个View类,而“ view ”标签在parsing时将检查class属性。