webentwicklung-frage-antwort-db.com.de

Wie man einen Wert von Fragment und Aktivität erhält

Wie kann ich einen Wert von Fragment und Aktivität erhalten?

11
Best Best

Dazu gibt es das Begleitobjekt ( https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects )

Definieren Sie Ihr Fragment wie gewohnt und deklarieren Sie den Begleiter, der in Java als statisches newInstance () - Äquivalent fungiert:

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
        }
    }
}

Und nennen Sie es einfach wie in Java:

val fragment = ViewStackListFragment.newInstance(4)
15
NSimon

Hier ist die von Android Studio vorgeschlagene Lösung (= wenn Sie ein leeres Fragment mit Datei -> Neu -> Fragment -> Fragment (leer) erstellen und "Objektfabrikmethoden einschließen" aktivieren). 

Setze dies in dein Fragment:

class MyFragment: Fragment {

...

    companion object {

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

.apply ist ein netter Trick, um Daten festzulegen, wenn ein Objekt erstellt wird, oder als sie geben hier an

Ruft die angegebene Funktion [Block] mit this value als Empfänger auf und gibt this Wert zurück.

Dann mach in deiner Aktivität oder im Fragment:

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

und lesen Sie die Argumente in Ihrem Fragment wie:

private var isMyBoolean = false

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

Genieße die Magie von Kotlin!

9
Spipau

verwenden Sie dies, um Argumente an Fragment zu senden

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
}

Und diese Argumente so bekommen

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

Tun Sie es in mehr Kotlin-Stil

1) Erstellen Sie eine Inline-Funktion:

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

2) Jetzt können Sie diese Erweiterung in allen Fragmenten verwenden, ohne Code zu kopieren:

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) Erstellen Sie Ihre Fragmente:

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

einfache Möglichkeit, Java aufzurufen .... auf diese Weise 

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