У Kotlin возникли проблемы при сканировании двух разных QR-кодов и стоимости магазина - PullRequest
1 голос
/ 03 октября 2019

Использование мобильной версии Google для сканирования QR-кода, два шага для сканирования двух QR-кодов:

Шаг 1: Нажмите кнопку 1, чтобы получить информацию первого QR-кода, а затем отобразить ее в Textview1 в MainActivity.

Шаг 2: Нажмите кнопку 2, чтобы получить вторую информацию о QR-коде, а затем отобразить ее в Textview2 в MainActivity.

Моя проблема заключается в том, что я могу передавать только значение QR-кода в MainActivity отдельно, то есть после того, как яполучите первый QR-код, а затем нажмите кнопку2, чтобы отсканировать второй, я потеряю свое первое значение в моем textview1.

My MainActivity получит значения из двух активаций Qrcode:

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
        }

    }

Основной код в первом действии QR-кода, передавая значения в 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)
                }
            }
        })

Основной код во втором действии QR-кода, передавая значения в 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)
                }
            }
        })

С помощью этой функции я могу успешно сканироватьQR-код и получить значение, но я не могу поместить оба значения в оба просмотра текста двумя шагами.

Как только я нажимаю другую кнопку, чтобы отсканировать второй QR-коди сканирование успешно, первое значение в моем Textview станет нулевым. Помогите мне, пожалуйста.

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

Сначала при запуске ScannerActivity с MainActivity, начните его с startActivityForResult().

При возврате результата из ScannerActivity замените startActivity() на setResult().

Изатем прослушайте результаты не onStart(), а onActivityResult() in MainActivity

Вот Документация для этого

0 голосов
/ 03 октября 2019

Когда вы запускаете MainActivity, каждая его переменная будет инициализирована заново, т.е. станет нулевой. У вас есть 2 решения,

  1. Сохраните ваши значения в SharedPreferences, чтобы более старое значение не получало. детали https://www.simplifiedcoding.net/android-sharedpreferences-example/

  2. использовать результат onActivity, который будет возвращать значение из второго действия

Для запуска действия, которое должно возвращать результат вызывающемуактивность, вы должны сделать что-то вроде ниже. Вы должны передать код запроса, как показано ниже, чтобы определить, что вы получили результат от действия, которое вы начали.

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");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...