簡體   English   中英

fragment和activity如何傳遞和獲取價值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM