From 1a000859bf46de47b5f44444d0bd1143a92612f2 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe <dev@mhibbe.de> Date: Thu, 30 Jun 2022 16:07:20 +0200 Subject: [PATCH] fix InstantiationException for fragments fragments must have a public, no-arg constructor. extra information must be passed as arguments. With a constructor that receives the data, the following error occurs: Fragment$InstantiationException: Unable to instantiate fragment ..... could not find Fragment constructor Signed-off-by: Marcel Hibbe <dev@mhibbe.de> --- .../talk/polls/ui/PollCreateDialogFragment.kt | 19 +++++++--- .../talk/polls/ui/PollMainDialogFragment.kt | 37 +++++++++++++++---- 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt index 1a39a35b3..2cc9f1bd7 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt @@ -25,9 +25,9 @@ import com.nextcloud.talk.polls.viewmodels.PollCreateViewModel import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) -class PollCreateDialogFragment( - private val roomToken: String -) : DialogFragment(), PollCreateOptionsItemListener { +class PollCreateDialogFragment() : DialogFragment(), PollCreateOptionsItemListener { + + lateinit var roomToken: String @Inject lateinit var viewModelFactory: ViewModelProvider.Factory @@ -42,6 +42,8 @@ class PollCreateDialogFragment( NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this) viewModel = ViewModelProvider(this, viewModelFactory)[PollCreateViewModel::class.java] + + roomToken = arguments?.getString(KEY_ROOM_TOKEN)!! } @SuppressLint("InflateParams") @@ -150,10 +152,15 @@ class PollCreateDialogFragment( */ companion object { private val TAG = PollCreateDialogFragment::class.java.simpleName + private const val KEY_ROOM_TOKEN = "keyRoomToken" @JvmStatic - fun newInstance( - roomTokenParam: String - ): PollCreateDialogFragment = PollCreateDialogFragment(roomTokenParam) + fun newInstance(roomTokenParam: String): PollCreateDialogFragment { + val args = Bundle() + args.putString(KEY_ROOM_TOKEN, roomTokenParam) + val fragment = PollCreateDialogFragment() + fragment.arguments = args + return fragment + } } } diff --git a/app/src/main/java/com/nextcloud/talk/polls/ui/PollMainDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/polls/ui/PollMainDialogFragment.kt index 252764950..40d71e231 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/ui/PollMainDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/polls/ui/PollMainDialogFragment.kt @@ -19,12 +19,12 @@ import com.nextcloud.talk.polls.viewmodels.PollMainViewModel import javax.inject.Inject @AutoInjector(NextcloudTalkApplication::class) -class PollMainDialogFragment( - private val user: UserEntity, - private val pollId: String, - private val roomToken: String, - private val pollTitle: String -) : DialogFragment() { +class PollMainDialogFragment() : DialogFragment() { + + lateinit var user: UserEntity + lateinit var roomToken: String + lateinit var pollId: String + lateinit var pollTitle: String @Inject lateinit var viewModelFactory: ViewModelProvider.Factory @@ -37,6 +37,11 @@ class PollMainDialogFragment( NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this) viewModel = ViewModelProvider(this, viewModelFactory)[PollMainViewModel::class.java] + + user = arguments?.getParcelable(KEY_USER_ENTITY)!! + roomToken = arguments?.getString(KEY_ROOM_TOKEN)!! + pollId = arguments?.getString(KEY_POLL_ID)!! + pollTitle = arguments?.getString(KEY_POLL_TITLE)!! } @SuppressLint("InflateParams") @@ -79,11 +84,13 @@ class PollMainDialogFragment( } private fun showVoteScreen() { - val contentFragment = PollVoteFragment( + + val contentFragment = PollVoteFragment.newInstance( viewModel, roomToken, pollId ) + val transaction = childFragmentManager.beginTransaction() transaction.replace(binding.messagePollContentFragment.id, contentFragment) transaction.commit() @@ -113,12 +120,26 @@ class PollMainDialogFragment( * Fragment creator */ companion object { + private const val KEY_USER_ENTITY = "keyUserEntity" + private const val KEY_ROOM_TOKEN = "keyRoomToken" + private const val KEY_POLL_ID = "keyPollId" + private const val KEY_POLL_TITLE = "keyPollTitle" + @JvmStatic fun newInstance( user: UserEntity, roomTokenParam: String, pollId: String, name: String - ): PollMainDialogFragment = PollMainDialogFragment(user, pollId, roomTokenParam, name) + ): PollMainDialogFragment { + val args = Bundle() + args.putParcelable(KEY_USER_ENTITY, user) + args.putString(KEY_ROOM_TOKEN, roomTokenParam) + args.putString(KEY_POLL_ID, pollId) + args.putString(KEY_POLL_TITLE, name) + val fragment = PollMainDialogFragment() + fragment.arguments = args + return fragment + } } }