2

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

timothy jeong
  • 97
  • 1
  • 12
  • 1
    You apparently have a Fragment that has no empty constructor but it’s hard to say which one it is because your stack trace has not been deobfuscated. You should never define a Fragment constructor because it is only valid to construct one with an empty constructor, which is generated by default if you don’t define one. Aside from that, make sure you upload your minification mappings to the store when you upload apks so you will get deobfuscated stack traces. – Tenfour04 Mar 15 '22 at 04:05
  • @Tenfour04 it was fragment used in viewpager adapter in the HomeFragment. Thanks!! – timothy jeong Mar 29 '22 at 11:33
  • @timothyjeong did you get solution? – Rohan Apr 08 '22 at 15:38
  • @Rohan yes I found my mistake. the problematic part was fixed before it was written in the post. the fragment attached to the viewpager and the dialog fragment had constructors, and I solved the problem by handling them. – timothy jeong Apr 09 '22 at 09:30
  • @timothyjeong how did you solve this issue ? – Hesham Morsy Nov 04 '22 at 02:51
  • 1
    @Hesham Morsy As I attached above, I made mistake. The code had fragments that have non empty constructor Specifically, they were fragments used for viewpager and dialog. I solved this issue by passing argument to fragment, not by constructor – timothy jeong Nov 04 '22 at 04:22

0 Answers0