代码之家  ›  专栏  ›  技术社区  ›  zie1ony

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

  •  2
  • zie1ony  · 技术社区  · 12 年前

    我试图在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>
    
    2 回复  |  直到 12 年前
        1
  •  5
  •   zie1ony    12 年前

    我找到了答案:实施 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
    
        }
    }
    
        2
  •  0
  •   Tomer Mor    12 年前

    不能调用Canvas Canvas=holder.lockCanvas()`

    在oncreate流完成之前,

    你应该在oncreate完成后调用它