Android 如何将自定义SurfaceView添加到XML布局

Android 如何将自定义SurfaceView添加到XML布局,android,surfaceview,android-xml,Android,Surfaceview,Android Xml,我尝试使用我自己的SurfaceView的XML格式,但我无法做到这一点。我得到NullPointerException。 根据互联网,它应该是这样的: 活动: package editor; import android.app.Activity; import android.os.Bundle; import com.example.balls_menu_v1.R; public class EditorActivity extends Activity { @Override p

我尝试使用我自己的SurfaceView的XML格式,但我无法做到这一点。我得到NullPointerException。 根据互联网,它应该是这样的: 活动:

package editor;

import android.app.Activity;
import android.os.Bundle;

import com.example.balls_menu_v1.R;

public class EditorActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.editor);
    EditorView ev = (EditorView) findViewById(R.id.editorView);

}
}
如果我对findViewById进行注释,就会得到NullPointerException。 表面视图:

package editor;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class EditorView extends SurfaceView {

    public EditorView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void onFinishInflate() {
        super.onFinishInflate();
        SurfaceHolder holder = getHolder();
        Canvas canvas = holder.lockCanvas();
        canvas.drawColor(Color.GREEN);
        holder.unlockCanvasAndPost(canvas);
    }
}
布局:editor.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <editor.EditorView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/editorView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    />
</RelativeLayout>
我找到了答案:实现SurfaceHolder.Callback,添加SurfaceView的所有3个构造函数,并添加getHolder.addCallbackthis;给每个构造函数。 代码:

我找到了答案:实现SurfaceHolder.Callback,添加SurfaceView的所有3个构造函数,并添加getHolder.addCallbackthis;给每个构造函数。 代码:


不能调用Canvas Canvas=holder.lockCanvas`

在oncreate流完成之前


您应该在oncreate finish之后调用它

您不能调用Canvas Canvas=holder.lockCanvas`

在oncreate流完成之前

您应该在oncreate完成后调用它

public class EditorView extends SurfaceView implements SurfaceHolder.Callback{

    public EditorView(Context context) {
        super(context);
        getHolder().addCallback(this);
        // TODO Auto-generated constructor stub
    }

    public EditorView(Context context, AttributeSet attrs) {
        super(context, attrs);
        getHolder().addCallback(this);
        // TODO Auto-generated constructor stub
    }

    public EditorView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        getHolder().addCallback(this);
        // TODO Auto-generated constructor stub
    }

    public void doDraw() {
        SurfaceHolder holder = getHolder();
        Canvas canvas = holder.lockCanvas();
        canvas.drawColor(Color.GREEN);
        holder.unlockCanvasAndPost(canvas);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {}

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        doDraw();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub

    }
}