【问题标题】:Multiple onActivityResult for 1 Activity using Zxing barcode使用 Zxing 条码的 1 个活动的多个 onActivityResult
【发布时间】:2018-08-16 12:45:18
【问题描述】:

我正在开发一个简单的应用程序,它从 pc 收集资产数据,每个资产都有两个条形码。条形码是序列号和型号。表单包含 2 个文本视图和 3 个按钮。每个文本视图返回每个的结果扫描。同时,2 个用于扫描条形码的按钮和 1 个用于将扫描结果提交到数据库的按钮。

下面的代码运行良好,但是当我使用任何“扫描”时,按钮总是将结果返回到序列号的第一个 textview。

public class MainActivity extends AppCompatActivity {

String scannedData;
TextView  contentTxt;
TextView  contentTxt2;

Button scanBtnSerial;
Button scanBtnModel;


//Button viewBtn;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final Activity activity =this;
    scanBtnSerial = (Button)findViewById(R.id.scan_btn);//to scan serial number
    scanBtnModel = (Button)findViewById(R.id.scan2_btn);//to scan model number

    contentTxt = (TextView)findViewById(R.id.textView);//to view scanned serial number
    contentTxt2 = (TextView)findViewById(R.id.textView3);//to view scanned model number

    final TextView textView=(TextView)findViewById(R.id.textView);

    scanBtnSerial.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            IntentIntegrator integrator = new IntentIntegrator(activity);
            integrator.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES);
            integrator.setPrompt("Scan Serial Number");
            integrator.setBeepEnabled(false);
            integrator.setCameraId(0);
            integrator.setBarcodeImageEnabled(false);
            integrator.initiateScan();

        }
    });

    scanBtnModel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            IntentIntegrator integrator = new IntentIntegrator(activity);
            integrator.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES);
            integrator.setPrompt("Scan Model Number");
            integrator.setBeepEnabled(false);
            integrator.setCameraId(0);
            integrator.setBarcodeImageEnabled(false);
            integrator.initiateScan();

        }
    });



}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    IntentResult result = IntentIntegrator.parseActivityResult(requestCode,resultCode,data);
    if(result!=null) {
        scannedData = result.getContents();
        if (scannedData != null) {

            Log.d("MainActivity", "Scanned");
            contentTxt.setText(result.getContents());
            new SendRequest().execute();//send to database 


        }else {
        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}

谁能建议我如何管理“onActivityResult”以显示每次扫描的数据?

UI sample

【问题讨论】:

  • 我在答案中添加了解决此问题的 ZXIng 方法 :-)

标签: java android-studio android-activity zxing


【解决方案1】:

快速简便的方法是替换onActivityResult中的这部分

Log.d("MainActivity", "Scanned");
contentTxt.setText(result.getContents());
new SendRequest().execute();//send to database 

Log.d("MainActivity", "Scanned");
if(TextUtils.isEmpty(contextText.getText())){
    contentTxt.setText(result.getContents());
} else {
    contentTxt2.setText(result.getContents());
}
new SendRequest().execute();//send to database 

但是,这很可能不是您想要/需要的。您应该区分结果中的输入并将它们分配给适当的TextViews。

如果您的代码有不同的预定义格式,考虑使用正则表达式来确定扫描的是哪个代码并将其分配给正确的TextView。 Android 有一个名为 Pattern 的帮助程序类,请查看。

生成的代码可能如下所示:

Log.d("MainActivity", "Scanned");
if(isSerialNumberString(result.getContents())){
    contentTxt.setText(result.getContents());
} else if(isModelNumberString(result.getContents())) {
    contentTxt2.setText(result.getContents());
}
new SendRequest().execute();//send to database 

如果没有,考虑使用设置流程,在该流程中,您要求用户首先扫描一个代码,将其放入 UI,然后要求他们扫描第二个代码。这样您就可以知道您当前期望的代码是什么。


编辑: 事实证明ZXing 有一个机制。因此,您需要做两件事:

首先,将自定义请求代码添加到您的 Integrators。所以 ScanBtnSerial 的 OnClickListener 将如下所示:

IntentIntegrator integrator = new IntentIntegrator(activity);
integrator.setRequestCode(1) //Make this a constant        
integrator.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES);
integrator.setPrompt("Scan Model Number");

对另一个 OnClickListener 执行相同操作,只需将 2 设置为 requestCode。

然后,在onResult 方法中,执行以下操作:

Log.d("MainActivity", "Scanned");
if(requestCode == 1) { //Again, use a const here
    contentTxt.setText(result.getContents());
} else if(requestCode == 2) {
    contentTxt2.setText(result.getContents());
}
new SendRequest().execute();//send to database 

【讨论】:

  • 感谢您的解释,我对活动的事情有了更多的了解。但是,为什么它显示错误无法解析方法setRequestCode?是否需要先创建方法?
【解决方案2】:

你可以通过设置一个全局布尔值来记住哪个活动已经开始,或者设置一个适当的 requestCode 像这样https://github.com/journeyapps/zxing-android-embedded/issues/41

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多