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

zie*_*ony 2 android surfaceview android-xml

我尝试在 XML 中使用我自己的 SurfaceView,但无法做到这一点。我得到 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);

}
}
Run Code Online (Sandbox Code Playgroud)

如果我发表评论,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);
    }
}
Run Code Online (Sandbox Code Playgroud)

布局: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>
Run Code Online (Sandbox Code Playgroud)

zie*_*ony 5

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

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

    }
}
Run Code Online (Sandbox Code Playgroud)