#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