【问题标题】:2 Scanners but one onActivityResult?2 个扫描仪,但只有一个 onActivityResult?
【发布时间】:2017-12-12 17:14:21
【问题描述】:

我正在 Android Studio 中开发一个移动应用程序,并且有 2 个按钮。 每个按钮都会使用 Zxing 库启动条码/QR 扫描。

我遇到的问题是我将第一次扫描的结果分配给按钮文本并且工作正常。

但是,当将第二次扫描的结果分配给其按钮时,它不起作用,因为只有一个 onActivityResult?

我知道如果我复制并粘贴代码并尝试覆盖 onActivityResult2,系统将忽略它,因为它无法被系统识别。

但是,我该如何解决这个问题?

这是我的 onActivityResult 代码和 onActivityResult2 代码,只是为了展示我想要实现的目标:

onActivityResult:

工作代码:

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

    if (result != null) {
        //if qrcode has nothing in it
        if (result.getContents() == null) {
            Toast.makeText(this, "Result Not Found", Toast.LENGTH_LONG).show();
        } else {
            //if qr contains data
            try {
                //converting the data to json
                JSONObject obj = new JSONObject(result.getContents());

            } catch (JSONException e) {
                e.printStackTrace();
                if (buttonId == R.id.buttonScan) {
                    machineType = result.getContents();
                    scanBarcode.setText("Machine Type: " + machineType);
                } else if (buttonId == R.id.buttonScan2) {
                    workOrderNumber = result.getContents();
                    scanWorkOrder.setText("Work Order Number: " + workOrderNumber);
                }
                else if (buttonId == 0) {
                    ???
                }

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

调用库的按钮:

private IntentIntegrator qrScan;
private IntentIntegrator qrScan2;

int buttonId = 0; //THIS IS GLOBAL

 //Initialise Buttons
    scanBarcode = findViewById(R.id.buttonScan);
    scanWorkOrder = findViewById(R.id.buttonScan2);
    submit = findViewById(R.id.buttonSubmit);

    sharedPreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);

    //Initialize Scanners
    qrScan = new IntentIntegrator(this);


    scanBarcode.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            qrScan.initiateScan();
            buttonId = R.id.buttonScan;
        }
    });

    scanWorkOrder.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            qrScan.initiateScan();
            buttonId = R.id.buttonScan2;

        }
    });

【问题讨论】:

  • 我们看不到 qrScan 和 qrScan2 的类型。
  • @greenapps 已更新。再次道歉
  • onActivityResult(int requestCode... requestCode 得到哪些值?它们有什么不同吗?
  • 请告诉您单击扫描按钮时会发生什么。扫描仪窗口/活动是否涵盖了您的活动?你能同时调用两个扫描器吗?
  • @greenapps 是的,当我单击每个按钮时,它会作为扫描仪进入相机......假设我只是对获得不同的结果感兴趣?我不太确定它不会让我调试的请求代码

标签: java android zxing barcode-scanner


【解决方案1】:

在遵循overloading 规则时,你不能有两个完全相同的方法,所以

对于两个请求,您可以有两个不同的requestCode,然后使用if 语句来识别您的请求类型或按钮点击响应

startActivityForResult (intent, 100); // 100 for button 1
startActivityForResult (intent, 101); // 101 for button 2

ActivityResult

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
    if (result != null) {
        //if qrcode has nothing in it
        if (result.getContents() == null) {
            Toast.makeText(this, "Result Not Found", Toast.LENGTH_LONG).show();
        } else {
            //if qr contains data
            try {
                //converting the data to json
                JSONObject obj = new JSONObject(result.getContents());

            } catch (JSONException e) {
                e.printStackTrace();

                workOrderNumber = result.getContents();
                if(requestCode == 100)
                    scanBarcode.setText("Machine Type: " + machineType);
                else if(requestCode == 101)
                    scanWorkOrder.setText("Work Order Number: " + workOrderNumber);                 
             }
        }
    } else {
        super.onActivityResult(requestCode, resultCode, data);
    }
}

【讨论】:

  • 你有什么代码可以给我看吗?
  • @Rajeey3 试试更新后的代码,你只需要传递不同的int values 作为请求代码,它会在不同的按钮点击上启动意图
  • 我应该把 StartActivityforResult 代码放在哪里?创建?以及这些代码如何知道它们用于哪些按钮?谢谢,虽然这是有道理的! @Pavneet_Singh
  • @Rajeey3 这是一个复制粘贴错字,只需使用覆盖的onActivityResult 并删除第二个
  • where do I put the StartActivityforResult codes? 。所以你没有使用 startActivityForResult()?行。然后在调用库的地方显示您的按钮 onclick 代码。请把所有的都放在你的帖子里。你应该从它开始。
【解决方案2】:
int buttonId = 0;

添加为全局变量。

buttonId = R.id.buttonScan;

添加到第一个按钮的onClick。

buttonId = R.id.buttonScan2;

添加到第二个按钮的 onClick。

检查您在 onActivityResult 中得到的内容并进行相应处理。

【讨论】:

  • 请展示你的 if 语句,因为我担心你做的不是最好的。
  • 谢谢! @greenapps 感谢您的帮助!
  • 见上文@greenapps
  • if (buttonId == 2131230756)。不好。它会起作用的。但它是不可读的代码,如果您在此按钮上方或按钮之间添加另一个按钮,则值将发生变化,您的代码将不再工作。更改为if (buttonId == R.id.buttonScan)
  • 还为 buttonId==0 或其他 buttonId 添加 else 语句。因为它可能在不同的设备上工作不同。然后展示吐司或其他东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多