【问题标题】:Kotlin having trouble scanning two different QR code and store valueKotlin 无法扫描两个不同的 QR 码并存储价值
【发布时间】:2019-10-03 14:48:35
【问题描述】:

使用谷歌手机版扫描二维码,分两步扫描两个二维码:

第一步:点击button1获取第一个二维码信息,然后在MainActivity的Textview1上显示。

第二步:点击button2获取第二个二维码信息,然后显示在MainActivity的Textview2上。

我的问题是我只能将二维码的值单独传递给我的 MainActivity,这意味着在我获得第一个二维码然后单击 button2 扫描第二个二维码后,我的 textview1 将丢失我的第一个值。

我的 MainActivity 从两个 Qrcode Activity 中获取值:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        btn_2.setOnClickListener {
            val intent = Intent(this, FirstQrcodeActivity::class.java)
            startActivity(intent)
        }
        btn_1.setOnClickListener {
            val box_intent = Intent(this, SecondQrcodeActivity::class.java)
            startActivity(box_intent)
        }

    }
override fun onStart() {
        super.onStart()
        val First_qrcode= intent?.getStringExtra("First_Qrcode")
        val Second_qrcode= intent?.getStringExtra("Second_Qrcode")
        if(First_qrcode!=null){
            text_view1.text = First_qrcode
        }
        if(Second_qrcode!=null){
            text_view2.text= Second_qrcode
        }
    
    }

First QRcode Activity 中的主代码,将值传递给 MainActivity:

        val builder = AlertDialog.Builder(this)
        svBarcode = findViewById(R.id.sv_Firstbarcode)
        detector = BarcodeDetector.Builder(this).setBarcodeFormats(Barcode.ALL_FORMATS).build()
        detector.setProcessor(object : Detector.Processor<Barcode> {
            @SuppressLint("MissingPermission")
            override fun receiveDetections(p0: Detector.Detections<Barcode>?) {
                val barcodes = p0?.detectedItems
                if (barcodes!!.size() > 0) {
                    builder.setMessage("barcodes.valueAt(0).displayValue)
                    builder.setOnCancelListener{
                        val intent = Intent(this@FirstQrcodeActivity, MainActivity::class.java)
                        intent.putExtra("First_Qrcode",barcodes.valueAt(0).displayValue)
                        startActivity(intent)
                    }
                    taskHandler.post(runnable)
                }
            }
        })

Second QRcode Activity 中的主代码,将值传递给 MainActivity:

        val builder = AlertDialog.Builder(this)
        svBarcode = findViewById(R.id.sv_Secondbarcode)
        detector = BarcodeDetector.Builder(this).setBarcodeFormats(Barcode.ALL_FORMATS).build()
        detector.setProcessor(object : Detector.Processor<Barcode> {
            @SuppressLint("MissingPermission")
            override fun receiveDetections(p0: Detector.Detections<Barcode>?) {
                val barcodes = p0?.detectedItems
                if (barcodes!!.size() > 0) {
                    builder.setMessage("barcodes.valueAt(0).displayValue)
                    builder.setOnCancelListener{
                        val intent = Intent(this@SecondQrcodeActivity, MainActivity::class.java)
                        intent.putExtra("Second_Qrcode",barcodes.valueAt(0).displayValue)
                        startActivity(intent)
                    }
                    taskHandler.post(runnable)
                }
            }
        })

使用这些功能,我可以成功扫描二维码并获取值,但我不能通过两步将两个值都放入两个文本视图中。

一旦我点击另一个按钮扫描第二个二维码并成功扫描,我的 Textview 中的第一个值将变为 Null。请帮帮我。

【问题讨论】:

  • 发布您的 MainActivity
  • 请检查,我已经更新,MainActivity 只包含 onCreateand 和 onStart 函数。
  • 查看下面的答案

标签: android kotlin


【解决方案1】:

当您启动 MainActivity 时,每个变量都会重新启动,即变为 null 你有 2 个解决方案,

  1. 将您的值保存在 SharedPreferences 中,这样旧值就不会得到 有关详细信息,请参阅下面的教程 https://www.simplifiedcoding.net/android-sharedpreferences-example/

  2. 使用 onActivity Result 从第二个活动返回值

为了启动应该将结果返回给调用活动的活动,您应该执行以下操作。您应该传递如下所示的请求代码,以识别您从开始的活动中获得了结果。

startActivityForResult(new Intent(“YourFullyQualifiedClassName”),requestCode);

在活动中你可以使用setData()返回结果。

Intent data = new Intent();
String text = "Result to be returned...."
//---set the data to pass back---
data.setData(Uri.parse(text));
setResult(RESULT_OK, data);
//---close the activity---
finish();

那么再次在第一个活动中,您在 onActivityResult() 中编写以下代码

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == request_Code) {
        if (resultCode == RESULT_OK) {
            String returnedResult = data.getData().toString();
            // OR
            // String returnedResult = data.getDataString();
        }
    }
}

根据您的评论进行编辑: 如果您想返回三个字符串,请按照意图使用键/值对而不是使用 Uri。

Intent data = new Intent();
data.putExtra("streetkey","streetname");
data.putExtra("citykey","cityname");
data.putExtra("homekey","homename");
setResult(RESULT_OK,data);
finish();

onActivityResult 中获取它们,如下所示:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == request_Code) {
        if (resultCode == RESULT_OK) {
            String street = data.getStringExtra("streetkey");
            String city = data.getStringExtra("citykey");
            String home = data.getStringExtra("homekey");
        }
    }
}

【讨论】:

  • 将其保存在 SharedPreferences 中是不好的做法,因为它适用于不同的事物,您应该使用 onActivityResult()
  • 解决了!谢谢!
【解决方案2】:

首先从MainActivity 开始ScannerActivity 时,以startActivityForResult() 开始。

ScannerActivity 返回结果时,将startActivity() 替换为setResult()

然后在MainActivity中收听结果不是onStart(),而是onActivityResult()

这里是Documentation for this

【讨论】:

  • 解决了!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-24
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
相关资源
最近更新 更多