In my application I want use this library for ImagePicker : https://github.com/SimformSolutionsPvtLtd/SSImagePicker
But after add this line private val imagePicker: ImagePicker = registerImagePicker(this)
show me Force close.
I want use this into Fragment and this fragment info ViewPager2 .
FragmentAdapter code :
class FragmentsAdapter (fragmentManager: FragmentManager, lifecycle: Lifecycle) :
FragmentStateAdapter(fragmentManager, lifecycle) {
override fun getItemCount(): Int {
return 2
}
override fun createFragment(position: Int): Fragment {
when (position) {
0 -> return FragmentA()
}
return FragmentB()
}
}
FragmentB codes :
class FragmentB : Fragment(), ImagePickerResultListener {
private val imagePicker: ImagePicker = registerImagePicker(this)
...
private fun openImagePicker() {
imagePicker
.title("Images")
.multipleSelection(false)
.showCountInToolBar(true)
.showFolder(true)
.cameraIcon(true)
.doneIcon(true)
.allowCropping(true)
.compressImage(true)
.maxImageSize(2.5f)
.extension(PickExtension.ALL)
imagePicker.open(PickerType.GALLERY)
}
}
Error message :
java.lang.IllegalStateException: Fragment MandatoryInfoFragment{ccb6b52} (d0165abf-9555-41a8-a139-d84da8774350) not attached to an activity.
at androidx.fragment.app.Fragment.requireActivity(Fragment.java:995)
at com.app.imagepickerlibrary.ImagePicker$Companion.registerImagePicker(ImagePicker.kt:232)
at com.myapp.ui.login.pages.complete.mandatory.MandatoryInfoFragment.<init>(FragmentB.kt:51)
at com.myapp.ui.login.pages.complete.FragmentsAdapter.createFragment(FragmentsAdapter.kt:22)
How can I fix it?
CodePudding user response:
The reason is registerImagePicker
is calling requireActivity()
to get the Context . And at the time of initialization requireActivity()
will return null
because the Fragment
is not attached yet to Activity
. See the code below.
fun Fragment.registerImagePicker(callback: ImagePickerResultListener): ImagePicker {
return ImagePicker(callback, requireActivity())
}
To fix this you can move the initialization down in lifecycle Tree of Fragment after the fragment is attached for example inside onViewCreated()
. Check fragment lifecycle.
class FragmentB : Fragment(), ImagePickerResultListener {
private lateinit var imagePicker: ImagePicker
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
imagePicker = registerImagePicker(this)
}
}
CodePudding user response:
Fix not attached to an activity in Android
You are not passing the context correctly that's why you are getting the error.
Add this line if you want to get the context of your activity.
private val imagePicker: ImagePicker = registerImagePicker(requireActivity)
or
Add this line if you want to get the context of your fragment.
private val imagePicker: ImagePicker = registerImagePicker(requireContext)