我通过创建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中使用它时没有任何反应。
答案 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 ”标记在解析时将检查类属性。