如何在Fragment和Activity之间传递值并获取值

38

如何从片段和活动中传递和获取值?


1
请勿重复提问,此问题已在 https://dev59.com/WGQm5IYBdhLWcg3wqwfn 中得到解答。 - faraz khonsari
10个回答

75

这是Android Studio提出的解决方案(当你使用File -> New -> Fragment -> Fragment(Blank)创建一个空白Fragment并勾选 "include fragment factory methods"时)。

将以下内容放入你的Fragment中:

class MyFragment: Fragment {

...

    companion object {

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

.apply是一个很好的技巧,可以在创建对象时设置数据,或者如这里所说的那样:

使用this值作为其接收器调用指定的函数[block]并返回this值。

然后在您的Activity或Fragment中执行:

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

阅读您的片段中的参数,例如:

private var isMyBoolean = false

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

享受 Kotlin 的魔力!


2
正是我所需要的。 注意:上下文是 @NonNull,您可以声明 onAttach(context: Context) - Raymond Chenon

20

这里有一个相应的伴生对象 (https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects)。

像往常一样定义你的片段(fragment),并声明伴生对象作为 Java 中静态newInstance()方法的等价物:

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

并且就像在Java中一样简单地调用它:

val fragment = ViewStackListFragment.newInstance(4)

3
谢谢!在我的情况下,这样做起作用:fragment.arguments = args。 - Jorge Casariego

10
使用此功能将参数发送到片段。
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
}

并像这样获取那些参数

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

参数是可选的,您需要使用 args?.getInt(...)。 - lostintranslation

8

Kotlin,Fragment: 用于传递

companion object {
    private const val ARGUMENT_ACTION = "ARGUMENT_ACTION"

    fun newInstance(action: Int) : MyFragment{
        return MyFragment().apply {
            arguments = bundleOf(ARGUMENT_ACTION to action)
        }
    }
}

获取(for get)
requireArguments().getInt(ARGUMENT_ACTION)

6

请更符合 Kotlin 风格。

1)创建一个内联函数:

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

2) 现在您可以在所有片段中使用此扩展,而无需重复编写代码:

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) 创建您的片段:

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

2

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

}


2

为了从片段和活动中传递和获取值,

val mFragment = Fragment()
val mArgs = Bundle()
mArgs.putInt("Key", value)
mFragment.setArguments(mArgs)

在你的第二个Activity/Fragment中使用这段代码来获取你的值。

var args = getArguments()
var index = args.getInt("Key", 0)

这段代码应该更像 Kotlin 风格。这是 Java 代码。 - Hellojeffy

0
  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
在Kotlin中,我可以创建片段并通过以下方式将值传递到另一个片段:
1.在第一个片段中放置字符串。
   val storedVerificationId:String = "verificationId"                                                                    
   val fragmentTransaction = fragmentManager?.beginTransaction()
                val bundle = Bundle().apply {
                    putString("storedVerificationId",storedVerificationId) //string and value.
                }

                val fragInfo = otpFragment() //otpFragment is Another Fragment name
                fragInfo.arguments = bundle //bundle in which values stored
                fragmentTransaction!!.replace(R.id.myDrawerlayout,fragInfo) //replace in main activity 
                fragmentTransaction.commit()

`

2. 第二个片段,其中包含 getString。

val verificationId = this.arguments?.getString("storedVerificationId")


0
在一份源代码中,我发现了这个版本:
class ConfirmPasswordActivity : Activity {

companion object {
    lateinit var person: Person
    fun newIntent(context: Context, person: Person) = run {
        this.person = person
        Intent(context, ConfirmPasswordActivity::class.java)
    }
}
private fun setOnClickListeners() {
    ib_back.setOnClickListener { finish() }
    btn_confirm_password.setOnClickListener {
        onNext(UiEvents.OnBtnConfirmClicked(person))
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接