Почему я получаю несоответствие типа при использовании «этого» на фрагменте Котлина

#android #kotlin

Вопрос:

Я могу успешно сканировать штрих-код, но почему-то не могу получить результат. Я обнаружил, что, поскольку я вызываю сканер штрих-кода во фрагменте, мне нужно изменить свой код, чтобы использовать это:

 class AddIerFragment : Fragment() { ....

   val intentIntegrator = IntentIntegrator.forFragment(this)
   ....
}
 

Проблема в том, что ключевое слово «это» недопустимо, потому что оно выдает мне ошибку

 Type mismatch
Requred: Fragment
Found AddIerFragment
 

Смотрите изображение ниже.

введите описание изображения здесь

У меня есть этот код во фрагменте

 companion object {
        @JvmStatic
        fun newInstance(param1: String, param2: String) =
            AddIerFragment().apply {
                arguments = Bundle().apply {
                }
            }
        private const val CAMERA = 1
        private const val GALLERY = 2
        private const val SCAN = 3
    }

R.id.button_atgScan -> {
                Dexter.withContext(context!!).withPermissions(
                    Manifest.permission.READ_EXTERNAL_STORAGE,
                    Manifest.permission.CAMERA
                )
                    .withListener(object: MultiplePermissionsListener {
                        override fun onPermissionsChecked(report: MultiplePermissionsReport?) {
                            report?.let{
                                if(report!!.areAllPermissionsGranted()) {
                                    
                       
                       
    intentIntegrator.setDesiredBarcodeFormats(IntentIntegrator.ONE_D_CODE_TYPES)
                                    intentIntegrator.setPrompt("Scan a barcode")
                                    intentIntegrator.setCameraId(0)
                                    intentIntegrator.setBeepEnabled(false)
                                    intentIntegrator.setBarcodeImageEnabled(true)
                                    intentIntegrator.setOrientationLocked(false)
                                    intentIntegrator.initiateScan()

                                }
                            }

                        }

                        override fun onPermissionRationaleShouldBeShown(
                            p0: MutableList<PermissionRequest>?,
                            p1: PermissionToken?
                        ) {
                            showRationalDialogForPermission()
                        }

                    }).onSameThread().check()
            }

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == GALLERY) {
            data?.let {
                val selectedPhotoUri = data.data
                file = File(getPath(selectedPhotoUri))
                gView!!.iv_ier_image.setImageURI(selectedPhotoUri)
            }
        } else if (requestCode == CAMERA) {
            data?.extras?.let {
                val thumbnail: Bitmap =
                    data.extras!!.get("data") as Bitmap
                file = savebitmap(thumbnail)!!
                gView!!.iv_ier_image.setImageBitmap(thumbnail)
            }
        }

        val result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data)
        if (result != null) {
            if (result.contents == null) {
                Log.i("TAG", "NOTHING")
            } else {
                Log.i("TAG", result.contents)
            }
        } else {
            super.onActivityResult(requestCode, resultCode, data)
        }
    }
 

Комментарии:

1. Что такое ан AddIerFragment ? Я не вижу этого ни в каком коде. Очевидно, это не распространяется Fragment .

2. Извини за это. Пожалуйста, посмотрите мою правку, сэр. фрагмент AddIerFragment расширяет фрагмент.

3. Не могли бы вы аннулировать кэш и перестроить его, чтобы посмотреть, имеет ли это значение? Кроме того, пожалуйста, убедитесь, что импорт правильный. Вероятно, в обратном порядке 🙂

Ответ №1:

Для поддержки или фрагментов androidx вы должны использовать IntentIntegrator.forSupportFragment(this)

Комментарии:

1. Это не только «IntentIntegrator.forSupportFragment», это » IntentIntegrator.forFragment(это)», у меня ошибка в части «это».

2. @Ibanez1408 Я не понял, что ты имеешь в виду. Используйте forSupportFragment вместо forFragment IntentIntegrator.forSupportFragment(this)

3. Я знаю, что «IntentIntegrator.forSupportFragment(это)» — это код, который мне нужно использовать. Я действительно использовал его. Моя проблема в том, что я получаю ошибку со стороны или «это» внутри «IntentIntegrator.forSupportFragment(ЭТО)»

Ответ №2:

AddIerFragment не должен быть подклассом правильного фрагмента. В верхней части его файла убедитесь, что вы импортировали androidx.fragment.app.Fragment вместо android.app.Fragment . И, предполагая , что вы используете zxing-android-встроенный, убедитесь, что вы звоните forSupportFragment , а не forFragment .

Комментарии:

1. Спасибо, сэр. Да, я использую zxing-встроенный android