xml布局中的自定义视图

时间:2010-07-15 23:30:21

标签: android xml layout

我通过创建SurfaceView类的子类来创建自己的视图。

但是我无法弄清楚如何从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中使用它时没有任何反应。

2 个答案:

答案 0 :(得分: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之后setContentView onCreate中调用的初始化函数中。

之前可能正在工作,因为从xml向构造函数充气时: 调用View(Context, AttributeSet)而不是View(Context)

答案 1 :(得分:11)

您在示例中错过的是标记名称,它应该是“查看”(第一个非首都)而不是“查看”。尽管您可以在大多数情况下将类名作为标记名称,但如果您的类是内部类,则不可能这样做,因为在Java标记中限制了Java中用于引用内部类的“$”符号。 因此,如果您想在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类,而“ view ”标记在解析时将检查类属性。