如何传递并从片段和活动中获取价值?
答案 0 :(得分:16)
有伴侣对象(https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects)
像往常一样定义片段,并声明在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)
答案 1 :(得分:13)
这是Android Studio建议的解决方案(=当您使用文件创建空白片段->新建->片段-> Fragment(Blank)并选中“包括片段工厂方法”时)。
将其放入片段中
class MyFragment: Fragment {
...
companion object {
@JvmStatic
fun newInstance(isMyBoolean: Boolean) = MyFragment().apply {
arguments = Bundle().apply {
putBoolean("REPLACE WITH A STRING CONSTANT", isMyBoolean)
}
}
}
}
.apply
是在创建对象或设置为they state here时设置数据的好技巧:
使用值为
this
的指定函数[block]作为接收者 并返回this
值。
然后在“活动”或“片段”中执行以下操作:
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
}
}
享受科特林的魔力!
答案 2 :(得分:6)
使用它将参数发送到片段
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)
答案 3 :(得分:3)
以更多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)
答案 4 :(得分: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
}
}
}
答案 5 :(得分: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)
答案 6 :(得分: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))
}
}
答案 7 :(得分:-1)
传递并从片段和活动中获取价值,
val mFragment = Fragment()
val mArgs = Bundle()
mArgs.putInt("Key", value)
mFragment.setArguments(mArgs)
在第二个Activity
/ Fragment
中使用此段代码来获取您的值。
var args = getArguments()
var index = args.getInt("Key", 0)