问题描述
成功扫描并获取条形码数据后,我想显示AlertDialog
。然后,当我单击OK
上的AlertDialog
按钮时,它将继续再次扫描条形码。除AlertDialog
之外,其他所有设备都工作正常,同时扫描了数据并显示了AlertDialog
,但显示了两次。我只想显示一个。
工作流程是首先createCameraSource()
,然后扫描条形码,然后显示名为AlertDialog
的{{1}}函数,然后再次打开相机dialogRack(String ..)
并扫描条形码并显示openCameraAgain()
,函数名为AlertDialog
。 dialogItem(String ..)
功能出现后,AlertDialog
出现了两次
openCameraAgain()
createCameraSource()
private void createCameraSource() {
barcodeDetector = new BarcodeDetector.Builder(this)
.setBarcodeFormats(Barcode.ALL_FORMATS)
.build();
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(@NonNull SurfaceHolder holder) {
if (ActivityCompat.checkSelfPermission(getApplicationContext(),Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
int width = surfaceView.getWidth();
int height = surfaceView.getHeight();
cameraSource = new CameraSource.Builder(ScanActivity.this,barcodeDetector)
.setRequestedPreviewSize(height,width)
.setAutoFocusEnabled(true)
.build();
try {
cameraSource.start(surfaceView.getHolder());
} catch (IOException e) {
e.printstacktrace();
}
} else {
ActivityCompat.requestPermissions(ScanActivity.this,new
String[]{Manifest.permission.CAMERA},REQUEST_CAMERA_PERMISSION); //CAMERA_CAPTURE_PERMISSIONS_REQUEST_CODE
}
}
@Override
public void surfaceChanged(@NonNull SurfaceHolder holder,int format,int width,int height) {
}
@Override
public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
cameraSource.stop();
}
});
barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
@Override
public void release() {
}
@Override
public void receiveDetections(Detector.Detections<Barcode> detections) {
final SparseArray<Barcode> barcodes = detections.getDetectedItems();
if (barcodes.size() != 0 && !decoded) {
decoded = true;
try {
intentData = URLDecoder.decode(barcodes.valueAt(0).displayValue,"UTF-8");
runOnUiThread(new Runnable() {
@Override
public void run() {
cameraSource.stop();
barcodeDetector.release();
dialogRack(intentData);
}
});
} catch (UnsupportedEncodingException e) {
e.printstacktrace();
}
} //End of if
}
});
} // End of createCameraSource function
dialogRack(final String rackNumber)
private void dialogRack(final String rackNumber) {
Log.i("Alert Dialog","Alert Dialog created for Rack Scanned");
AlertDialog.Builder alertDialog = new AlertDialog.Builder(ScanActivity.this);
alertDialog.setTitle("Rack")
.setMessage("Rack Number : " + rackNumber)
.setPositiveButton("OK",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
tvRack.setText(rackNumber);
openCameraAgain();
}
}).create().show();
}
openCameraAgain()
private void openCameraAgain(){
Log.i("Camera Scan","openCamera() start");
if (ActivityCompat.checkSelfPermission(getApplicationContext(),Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
return;
}
try {
cameraSource.start(surfaceView.getHolder());
} catch (IOException e) {
e.printstacktrace();
}
barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
@Override
public void release() { }
@Override
public void receiveDetections(Detector.Detections<Barcode> detections) {
//Start scanning for item
final SparseArray<Barcode> itemBarCode = detections.getDetectedItems();
if (itemBarCode.size() != 0) {
try {
intentData = URLDecoder.decode(itemBarCode.valueAt(0).displayValue,"UTF-8");
runOnUiThread(new Runnable() {
@Override
public void run() {
cameraSource.stop();
barcodeDetector.release();
Log.i("Camera Close","Camera Source Stop,Barcode Detector Off");
dialogItem(intentData);
}
});
} catch (UnsupportedEncodingException e) {
e.printstacktrace();
}
} //End of if
}
});
}
dialogItem(final String itemNumber)
解决方法
AlertDialog两次,因为您需要在单击alertDialog的ok按钮时关闭dialogItem对话框。否则,您没有机会单击 ok 按钮,而不会得到 AlertDialog
因此在DialogItem上单击OK
private void dialogItem(final String itemNumber){
Log.i("Alert Dialog","Alert Dialog created for Item Scanned");
AlertDialog.Builder alertDialog = new AlertDialog.Builder(ScanActivity.this);
alertDialog.setTitle("Item")
.setMessage("Scanned Item Number : " + itemNumber)
.setPositiveButton("OK",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
try {
//CANCEL YOUR ALERT DIALOG HERE BEFORE OPENCAMERA
arrayListSerialNumber.add(itemNumber);
adapter.notifyDataSetChanged();
openCameraAgain();
}catch (Exception e){
e.printStackTrace();
}
}
}).create().show();
}
,好吧,我使用static
解决了创建AlertDialog
的问题。
static AlertDialog dialog;
static AlertDialog.Builder alertDialog;
显示对话框功能,创建对话框并显示
private void dialogRack(final String rackNumber) {
alertDialog = new AlertDialog.Builder(ScanActivity.this);
alertDialog.setTitle("Title")
.setMessage("Message")
.setPositiveButton("OK",int which) {
// onClick Function
}
});
dialog = alertDialog.create();
dialog.show();
} //end of dialogRack
为确保点击后将您的dialog
解雇,您可以使用下面的if-else
语句,
if(dialog != null && dialog.isShowing()){
//Action or wait for dismiss
}else{
//Dialog is closed
}