2

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

}
}

コメント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>
4

2 に答える 2

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

    }
}
于 2012-08-12T14:09:54.873 に答える
0

Canvas canvas = holder.lockCanvas();` を呼び出すことはできません

oncreate フローが終了する前に、

oncreate の終了後に呼び出す必要があります

于 2012-08-12T14:13:01.657 に答える