Error Could not find Fragment constructor

Viewed 1476

some users are suffering from 'could not find Fragment constructor' error but I can't reproduce this error on my emulator and test device

I read these resources [Could not find Fragment constructor], [Could not find fragment constructor (settings activity)], [Could not find Fragment constructor kotlin] but it didn't help.

All the resource tells me to add an empty constructor to the fragment, but in my case every fragment has an empty constructor.

I Share stackTrace and codes below

stackTrace

java.lang.RuntimeException: Unable to start activity ComponentInfo{{packageName}/{packageName}.presentation.main.MainActivity}: androidx.fragment.app.o$d: Unable to instantiate fragment a9.a: could not find Fragment constructor
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2805)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2883)
    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4726)
    at android.app.ActivityThread.-wrap18(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1619)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6523)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:857)
Caused by: androidx.fragment.app.o$d: Unable to instantiate fragment a9.a: could not find Fragment constructor
    at androidx.fragment.app.c0$b.a(:5)
    at androidx.fragment.app.h0.a(Unknown Source:2)
    at androidx.fragment.app.i0.<init>(Unknown Source:13)
    at androidx.fragment.app.c0.W(:8)
    at androidx.fragment.app.c0.b(:23)
    at androidx.fragment.app.u.lambda$init$1(:1)
    at androidx.fragment.app.u.i(Unknown Source:0)
    at androidx.fragment.app.t.a(Unknown Source:2)
    at androidx.activity.ComponentActivity.onCreate(:1)
    at androidx.fragment.app.u.onCreate(Unknown Source:0)
    at {packageName}.presentation.main.MainActivity.onCreate(Unknown Source:0)
    at android.app.Activity.performCreate(Activity.java:7013)
    at android.app.Activity.performCreate(Activity.java:7004)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
    at androidx.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:2)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2758)
    ... 10 more
Caused by: java.lang.NoSuchMethodException: <init> []
    at java.lang.Class.getConstructor0(Class.java:2320)
    at java.lang.Class.getConstructor(Class.java:1725)
    ... 26 more

MainActivity

  • using 'com.google.android.material.bottomnavigation.BottomNavigationView'
  • linked with navigation graph(total 4 fragment)
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        val navFragment = supportFragmentManager.findFragmentById(R.id.mainActivityContainer) as NavHostFragment
        val navController = navFragment.navController
        binding.bottomNavi.setupWithNavController(navController)
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        this.intent = intent
    }

    override fun onResume() {
        super.onResume()
        val dest = intent.getStringExtra("destination")
        dest?.let {
            when (it) {
                "mypage" -> { binding.bottomNavi.selectedItemId = R.id.myPageFragment }
                "lounge" -> { binding.bottomNavi.selectedItemId = R.id.loungeFragment }
                "alarm" -> { binding.bottomNavi.selectedItemId = R.id.alarmFragment }
            }
            intent.removeExtra("destination")
        }
    }
}

HomeFragment

  • inject Glide RequestManager
  • setup toolbar in MainActivity layout
  • HouseContentAction is Interface
import androidx.fragment.app.viewModels

@AndroidEntryPoint
class HomeFragment: Fragment(), HouseContentAction {
    private var _binding: FragmentMainHomeBinding? = null
    private val binding get() = _binding!!
    private val viewModel: HomeViewModel by viewModels()
    @Inject lateinit var glide: RequestManager

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentMainHomeBinding.inflate(layoutInflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        ...
        setUpToolBar()
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }

    private fun setUpToolBar() {
        (requireActivity() as AppCompatActivity).setSupportActionBar(binding.homeToolbar)
        (requireActivity() as AppCompatActivity).supportActionBar?.setIcon(AppCompatResources.getDrawable(requireContext(), R.drawable.head_logo))
        (requireActivity() as AppCompatActivity).supportActionBar?.title = ""
    }

LoungeFragment

@AndroidEntryPoint
class LoungeFragment:Fragment(), LoungeContentActions, LoungeActions {
    private var _binding: FragmentMainLoungeBinding? = null
    private val binding get() = _binding!!
    private val viewModel: LoungeViewModel by viewModels()
    @Inject lateinit var glide: RequestManager

    override fun onCreateView() {
        //same as above
    }

    override fun onViewCreated() {
        //same as above, but no toolbar setting
    }

    override fun onDestroyView() {
        //same as above
    }

MyPageFragment

same as above, but no toolbar

AlarmFragment

same as above, but no toolbar setting and no inject glide

0 Answers
Related