add-ContentView上的Android-JavaNullPointer

时间:2016-03-10 05:33:27

标签: java android surfaceview

我无法设置contentView:

如何使用此代码做得更好,我尝试使用asyncTask类但返回相同的错误。

  

代码退出错误:此行上的JavaNullPointer   addContentView(surface,new   ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT));

private SurfaceView cameraView;
private String barcodeInfo;
private CameraSource cameraSource;
private Renderer renderer;
private RajawaliSurfaceView surface;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //--------------------------------------------------------

    //--------------------------------------------------------
    cameraView = (SurfaceView) findViewById(R.id.cameraView);
    //barcodeInfo = (TextView) findViewById(R.id.infoTextView);

    BarcodeDetector detector = new BarcodeDetector.Builder(this).setBarcodeFormats(Barcode.QR_CODE).build();
    cameraSource = new CameraSource.Builder(this, detector).setRequestedPreviewSize(640, 480).build();

    cameraView.getHolder().addCallback(new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            try {
                cameraSource.start(cameraView.getHolder());
            } catch (IOException e) {
                Log.e("CAMERA SOURCE", e.getMessage());
            }
        }

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

        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            cameraSource.stop();
        }
    });

    detector.setProcessor(new Detector.Processor<Barcode>() {
        @Override
        public void release() {

        }

        @Override
        public void receiveDetections(Detector.Detections<Barcode> detections) {
            release();
            final SparseArray<Barcode> barcodes = detections.getDetectedItems();
            if (barcodes.size() == 1) {

                MainActivity.this.runOnUiThread(new Runnable() {
                    public void run() {
                        muestraMono();
                    }
                });
            }
        }
    });
}
public void muestraMono(){
    setContentView(R.layout.activity_main);
    RajawaliSurfaceView surface = new RajawaliSurfaceView(this);
    surface.setFrameRate(60.0);
    surface.setRenderMode(IRajawaliSurface.RENDERMODE_WHEN_DIRTY);
    surface.setTransparent(true);
    addContentView(surface, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT));
    renderer = new Renderer(this);
    surface.setSurfaceRenderer(renderer);
}
  

E / AndroidRuntime:致命异常:主要                                                                       处理:com.dsinteg.lectorqr,PID:2822                                                                       显示java.lang.NullPointerException                                                                           在android.opengl.GLSurfaceView.onResume(GLSurfaceView.java:567)                                                                           在   org.rajawali3d.surface.RajawaliSurfaceView.onResume(RajawaliSurfaceView.java:106)                                                                           在   org.rajawali3d.surface.RajawaliSurfaceView.onAttachedToWindow(RajawaliSurfaceView.java:125)                                                                           在android.view.View.dispatchAttachedToWindow(View.java:12618)                                                                           在android.view.ViewGroup.addViewInner(ViewGroup.java:3621)                                                                           在android.view.ViewGroup.addView(ViewGroup.java:3435)                                                                           在android.view.ViewGroup.addView(ViewGroup.java:3411)                                                                           在   com.android.internal.policy.impl.PhoneWindow.addContentView(PhoneWindow.java:321)                                                                           在android.app.Activity.addContentView(Activity.java:2016)                                                                           在com.dsinteg.lectorqr.MainActivity.muestraMono(MainActivity.java:93)                                                                           在com.dsinteg.lectorqr.MainActivity $ 2 $ 1.run(MainActivity.java:81)                                                                           在android.os.Handler.handleCallback(Handler.java:733)                                                                           在android.os.Handler.dispatchMessage(Handler.java:95)                                                                           在android.os.Looper.loop(Looper.java:136)                                                                           在android.app.ActivityThread.main(ActivityThread.java:5336)                                                                           at java.lang.reflect.Method.invokeNative(Native Method)                                                                           在java.lang.reflect.Method.invoke(Method.java:515)                                                                           在   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:871)                                                                           在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)                                                                           在dalvik.system.NativeStart.main(本地方法)

2 个答案:

答案 0 :(得分:0)

试试这个,

getWindow().addContentView(surface, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT));

发生错误,因为活动不知道父母。

答案 1 :(得分:0)

SetContentView将覆盖布局,并将其替换为新布局。通常,您只想在onCreate中执行此操作一次。你可以做得更多,但它涉及重新绘制整个布局,所以尝试删除这一行

setContentView(R.layout.activity_main);

使用muestraMono方法。

<强>更新

像这样创建方法

public void muestraMono(){
    surface = new RajawaliSurfaceView(this); // make RajawaliSurfaceView a class variable
    surface.setFrameRate(60.0);
    surface.setRenderMode(IRajawaliSurface.RENDERMODE_WHEN_DIRTY);
    surface.setTransparent(true);
    addContentView(surface, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT));
    renderer = new Renderer(this);
    surface.setSurfaceRenderer(renderer);
}

然后在onCreate中调用此方法,在扫描QR码后再次调用此方法

相关问题