如何从片段和活动中传递和获取值?
这是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 的魔力!
@NonNull
,您可以声明 onAttach(context: Context)
。 - Raymond Chenon这里有一个相应的伴生对象 (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)
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)
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)
}
}
}
requireArguments().getInt(ARGUMENT_ACTION)
请更符合 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)
在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
}
}
}
为了从片段和活动中传递和获取值,
val mFragment = Fragment()
val mArgs = Bundle()
mArgs.putInt("Key", value)
mFragment.setArguments(mArgs)
在你的第二个Activity
/Fragment
中使用这段代码来获取你的值。
var args = getArguments()
var index = args.getInt("Key", 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)
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")
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))
}
}