Переглянути джерело

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>
Marcel Hibbe 3 роки тому
батько
коміт
1a000859bf

+ 13 - 6
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
+        }
     }
 }

+ 29 - 8
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
+        }
     }
 }