[英]Android- JavaNullPointer on addContentView
我如何使用此代碼做得更好,我嘗試使用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:android.opengl.GLSurfaceView.onResume(GLSurfaceView.java:567)上的org.rajawali3d.surface.RajawaliSurfaceView.onResume上的com.dsinteg.lectorqr,PID:2822 java.lang.NullPointerException org.rajawali3d.surface.RajawaliSurfaceView.onAttachedToWindow(RajawaliSurfaceView.java:125)上的RajawaliSurfaceView.java:106)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)at android.app.Activity.addContentView(Activity.java:2016)at com.dsinteg.lectorqr.MainActivity.muestraMono(MainActivity.java:93)at 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.Loop er.loop(Looper.java:136)at android.app.ActivityThread.main(ActivityThread.java:5336)at java.lang.reflect.Method.invokeNative(Native Method)at java.lang.reflect.Method.invoke( com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:871)的Method.java:515)dalvik.system處com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)的MethodAndArgsCaller.run .NativeStart.main(本機方法)
嘗試這個,
getWindow().addContentView(surface, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT));
發生錯誤是因為活動不認識父級。
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
調用此方法一次又一次調用此方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.