Home > Enterprise >  How to fix not attached to an activity in Android
How to fix not attached to an activity in Android

Time:09-09

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)
  • Related