[英]How to pass and get value from fragment and activity
fragment和activity如何傳遞和獲取價值?
這是 Android Studio 建議的解決方案(= 當您使用 File -> New -> Fragment -> 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
是一個很好的技巧,可以在創建對象時設置數據,或者正如它們在此處聲明的那樣:
使用
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 的魔力!
有對應的對象( 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)
使用它向片段發送參數
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 的風格來做
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)
Kotlin,片段:用於通行證
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)
在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)
在一個源代碼中,我發現了這個版本:
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))
}
}
在 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.Second Fragment 其中getString。
val verificationId = this.arguments?.getString("storedVerificationId")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.