Фрагменты должны вызывать регистр RegisterForActivityResult() перед их созданием.Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Фрагменты должны вызывать регистр RegisterForActivityResult() перед их созданием.

Сообщение Anonymous »

Я работаю над приложением для покупок и создал фрагмент для добавления продуктов в список продуктов.
Мне нужно прочитать разрешение внешнего хранилища, чтобы добавить фотографию к продуктам, поэтому я пытаюсь использовать RegisterForActivityResult() в своем фрагменте, но получаю ошибку.
Я новичок в программировании для Android, поэтому не знаю, правильно ли я его использую.
Я попробовал все ответы на другие вопросы, которые я задавал найдены, но они не работают.
Сообщение об ошибке:
IllegalStateException: Fragment AddActivity after being created. Fragments must call rHgS5orgPvsuzJ7shn8vw28y1XaePY4uDP() before they are created (i.e. initialization, onAttach(), or onCreate()).
at androidx.fragment.app.Fragment.prepareCallInternal(Fragment.java:3482)
at androidx.fragment.app.Fragment.rHgS5orgPvsuzJ7shn8vw28y1XaePY4uDP(Fragment.java:3449)
at com.example.TheDentalSupplies.AddActivity.showImageChooser(AddActivity.kt:120)
at com.example.TheDentalSupplies.AddActivity.requestPermission(AddActivity.kt:96)
at com.example.TheDentalSupplies.AddActivity.onViewCreated$lambda-1(AddActivity.kt:66)
at com.example.TheDentalSupplies.AddActivity.lambda$gx8TAUa5Jk3WDkvGOWG0oB39kiM(Unknown Source:0)
at com.example.TheDentalSupplies.-$$Lambda$AddActivity$gx8TAUa5Jk3WDkvGOWG0oB39kiM.onClick(Unknown Source:4)
at android.view.View.performClick(View.java:7125)
at android.view.View.performClickInternal(View.java:7102)

AddActivity.kt:
class AddActivity : Fragment() {
private lateinit var img:ImageView
private lateinit var requestLauncher: ActivityResultLauncher

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {

requestLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) {
if(it){
showImageChooser(img)
}else{
Toast.makeText(requireContext(), "PERM", Toast.LENGTH_SHORT).show()
}
}
return inflater.inflate(R.layout.addpost, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val image1 = view.findViewById(R.id.addImage1)
val image2 = view.findViewById(R.id.addImage2)
val image3 = view.findViewById(R.id.addImage3)
val image4 = view.findViewById(R.id.addImage4)
val image5 = view.findViewById(R.id.addImage5)

image1.setOnClickListener {
requestPermission(image1)
}
image2.setOnClickListener {
requestPermission(image2)
}
image3.setOnClickListener {
requestPermission(image3)
}
image4.setOnClickListener {
requestPermission(image4)
}
image5.setOnClickListener {
requestPermission(image5)
}
val publishBtn = view.findViewById(R.id.addPublishBtn)

publishBtn.setOnClickListener { addItem(view) }

}

private fun requestPermission(imageView: ImageView) {
img = imageView

if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {

showImageChooser(imageView)
}
else{

ActivityCompat.requestPermissions(requireActivity(), arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), Constants.READ_STORAGE_PERMISSION_CODE)
requestLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)

}

}

fun showImageChooser(imageView: ImageView) {
val galleryIntent = Intent(
Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI
)

val launchSomeActivity = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val data: Intent? = result.data
if (data != null){
try {
val mSelectedImageFileUri = data.data!!

//setUserPic.setImageURI(Uri.parse(selectedImageFileUri.toString()))
GlideLoader(requireContext()).loadUserPicture(mSelectedImageFileUri,imageView)

//FireStoreClass().uploadImgCloud(requireActivity(), mSelectedImageFileUri)

}catch (e: IOException){
e.printStackTrace()
Toast.makeText(
requireContext(),
"Image selection failed",
Toast.LENGTH_SHORT
).show()
}
}
}
}

launchSomeActivity.launch(galleryIntent)
}

private fun addItem(view: View) {
//val image1 = view.findViewById(R.id.addImage1)
val addProductName = view.findViewById(R.id.addTitleEditText).text.toString()
val addProductDesc = view.findViewById(R.id.addDescEditText).text.toString()
val addProductPrice = view.findViewById(R.id.addPrice).text.toString()
val addProductCat = view.findViewById(R.id.selectCategoryEt).text.toString()

when{
TextUtils.isEmpty(addProductName.trim { it Toast.makeText(activity,
"Please Enter Product Name.",
Toast.LENGTH_SHORT).show()

TextUtils.isEmpty(addProductDesc.trim { it Toast.makeText(activity,
"Please Enter Product Description.",
Toast.LENGTH_SHORT).show()

TextUtils.isEmpty(addProductCat.trim { it Toast.makeText(activity,
"Please Select Product Category.",
Toast.LENGTH_SHORT).show()

TextUtils.isEmpty(addProductPrice.trim { it Toast.makeText(activity,
"Please Enter Product Price.",
Toast.LENGTH_SHORT).show()

else -> {
//val index = 0
val firebaseUser: String = Firebase.auth.currentUser!!.uid
val product = ProductItem(R.drawable.add_box,
addProductName,
0.0,
"Serhat Yilmaz",
addProductPrice.toInt(),
addProductDesc,
addProductCat.toInt(),
firebaseUser)

//Datasource.productList.add(index,product)
FireStoreClass().addProduct(requireActivity(), product)
//Toast.makeText(activity, "Product Published!", Toast.LENGTH_SHORT).show()
val action = AddActivityDirections.actionAddPostNavActivityToProductFragment()
view.findNavController().navigate(action)
}
}
}

}


Подробнее здесь: https://stackoverflow.com/questions/684 ... re-created
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»