web-dev-qa-db-fra.com

Comment transmettre et tirer profit du fragment et de l'activité

Comment transmettre et tirer profit du fragment et de l'activité?

11
Best Best

Il y a l'objet compagnon pour cela ( https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects )

Définissez votre fragment comme d'habitude et déclarez le compagnon qui agit comme l'équivalent statique newInstance () en Java:

class ViewStackListFragment : Fragment() {
  companion object {
        fun newInstance(position: Int): ViewStackListFragment {
            val fragment = ViewStackListFragment()
            val args = Bundle()
            args.putInt("position", position)
            fragment.setArguments(args)
            return fragment
        }
    }
}

Et appelez-le simplement comme en Java:

val fragment = ViewStackListFragment.newInstance(4)
15
NSimon

Voici la solution proposée par Android Studio (= lorsque vous créez un fragment vide avec Fichier -> Nouveau -> Fragment -> Fragment (vide) et que vous cochez la case "inclure les méthodes de fabrique de fragments"). 

Mettez ceci dans votre fragment:

class MyFragment: Fragment {

...

    companion object {

            @JvmStatic
            fun newInstance(isMyBoolean: Boolean) = MyFragment().apply {
                arguments = Bundle().apply {
                    putBoolean("REPLACE WITH A STRING CONSTANT", isMyBoolean)
                }
            }
     }
}

.apply est une astuce intéressante pour définir les données lorsqu'un objet est créé ou en tant que ils indiquent ici

Appelle la fonction spécifiée [block] avec la valeur this comme récepteur et retourne la valeur this.

Ensuite, dans votre activité ou votre fragment, faites:

val fragment = MyFragment.newInstance(false)
... // transaction stuff happening here

et lisez les arguments de votre fragment tels que:

private var isMyBoolean = false

override fun onAttach(context: Context?) {
    super.onAttach(context)
    arguments?.getBoolean("REPLACE WITH A STRING CONSTANT")?.let {
        isMyBoolean = it
    }
}

Profitez de la magie de Kotlin!

9
Spipau

utiliser ceci pour envoyer des arguments à fragmenter

fun newInstance(index: Int): MyFragment {
    val f = MyFragment ()
    // Pass index input as an argument.
    val args = Bundle()
    args.putInt("index", index)
    f.setArguments(args)
    return f
}

Et obtenez ces arguments comme ça

val args = arguments
val index = args.getInt("index", 0)
4
Ankit Kumar

Faites-le dans plus de style Kotlin

1) Créer une fonction inline:

inline fun <FRAGMENT : Fragment> FRAGMENT.putArgs(argsBuilder: Bundle.() -> Unit): FRAGMENT = this.apply { arguments = Bundle().apply(argsBuilder) }

2) Vous pouvez maintenant utiliser cette extension dans tous les fragments sans duplication de code:

class MyFragment: Fragment() {
    companion object {
        fun newInstance(name: String) = MyFragment().putArgs {
             putString("nameKey", name)
        }
    }
}

class MyFragment1: Fragment() {
     companion object {
         fun newInstance(boolean: Boolean) = MyFragment1().putArgs {
              putBoolean("booleanKey", boolean)
         }
     }
}

3) Créez vos fragments:

val myFragment = MyFragment.newInstance("NAME")
val myFragment1 = MyFragment1.newInstance(true)
3
Krasavello13

moyen simple d'appeler en Java .... comme ça 

class ViewStackListFragment : Fragment() {
  companion object {
        fun newInstance(position: Int): ViewStackListFragment {
            val fragment = ViewStackListFragment()
            val args = Bundle()
            args.putInt("position", position)
            fragment.setArguments(args)
            return f
        }
}

}

2
RaghuPrasanth V
  val otpFragment = OtpFragment()
  val bundle = Bundle()
  bundle.putString("otp", loginDetails[0].otp)
  otpFragment.arguments = bundle
  CommonUtil.changeFragment(otpFragment, R.id.flLogin, Login.manager, R.anim.enter_anim, R.anim.exit_anim)
0
jayesh patel