2010-07-15 295 views
14

我通过创建SurfaceView类的子类创建了自己的视图。xml布局中的自定义视图

但是我无法弄清楚如何从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。

回答

17

你想:

<?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); 
} 

如果不起作用尝试把在您在Activity小号的onCreate setContentView后调用init函数。

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

+0

随着我的第一个layout我刚刚收到一个黑屏,与此应用程序崩溃,而不是。 – monoceres 2010-07-15 23:41:06

+0

什么是堆栈跟踪? – Qberticus 2010-07-15 23:44:27

+0

http://pastebin.com/u2t3jdMt – monoceres 2010-07-15 23:50:31

11

您在示例中错过的是标签名称,它应该是“视图”(第一个非大写)而不是“视图”。虽然大多数情况下可以将类名称作为标记名称,但如果您的类是内部类,则不可能这样做,因为在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类,而“查看”标记在分析时将检查类属性。

+1

OMG我爱你(以严格的非柏拉图式的方式)! – samosaris 2013-06-30 16:55:41

+0

@SamusArin +1爱他哈哈 – 2013-07-05 02:08:34

+0

记得要添加所有的构造函数。如果您重写视图,则有3个构造函数:视图(上下文上下文), 视图(上下文上下文,AttributeSet attrs)和 视图(上下文上下文,属性集attrs,int defStyleAttr) – SoloPilot 2014-01-20 20:08:32