我想知道將資料從片段傳遞回其容器活動的慣用方法是什么?
考慮這個注冊活動:
class SignUpActivity : AppCompatActivity() {
lateinit var uiBinding: ActivitySignUpBinding
lateinit var btnNext: MaterialButton
lateinit var currentFragment: Fragment
var fragmentIdx: Int = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
uiBinding = ActivitySignUpBinding.inflate(layoutInflater)
currentFragment = InputBasicDataFragment()
supportFragmentManager.beginTransaction().replace(R.id.fragment_signup_container,
currentFragment).commit()
btnNext = uiBinding.btnSignUpNext
val pref = SharedPrefUtil()
btnNext.setOnClickListener {
when (fragmentIdx){
0 -> {
fragmentIdx
// read all the data on InputBasicData fragment, then save them on shared pref
pref.write('FRAGMENT1_NAME', '....')
pref.write('FRAGMENT1_MAIL', '....')
currentFragment = InputAdditionalDataFragment()
}
1-> {
fragmentIdx
// read all the data on InputAdditionalData fragment, then save them on shared pref as well
pref.write('FRAGMENT2_HOME_ADDRESS', '....')
pref.write('FRAGMENT2_JOB', '....')
pref.write('FRAGMENT2_WORK_ADDRESS', '....')
currentFragment = PreviewDataFragment()
}
2 -> {
// done. ready to upload data that are stored in shared pref
// let's hit the API ...
intent iii = Intent(this@SignUpActivity, NextActivity::class.java)
startActivity(iii)
}
}
supportFragmentManager.beginTransaction().replace(R.id.fragment_signup_container,
currentFragment).commit()
}
setContentView(uiBinding.root)
}
}
這 3 個片段上沒有按鈕,基本上只有 TextView 和 EditText。按鈕位于容器活動上。首先片段容器加載InputBasicDataFragment. 單擊按鈕時,如何訪問所有輸入以便保存在共享首選項中?
uj5u.com熱心網友回復:
我在 Jetpack 庫中以及至少在有關 Fragment 的檔案中看到的典型模式是讓 Fragment 提供一個回呼介面,Activity 可以選擇實作該介面。當 Fragment 中發生觸發動作時,檢查附加的 Activity 是否實作了該介面,如果實作則呼叫它。
class MyFragment(): Fragment(R.layout.my_layout) {
interface MyActionListener {
onSomethingReady(someData: Something)
}
// In some callback …
(activity as? MyActionListener)?.onSomethingReady(something)
但是,在您的用例中,您的 Activity 功能與片段緊密相關,并且只想獲取其 UI 控制元件的當前值。我認為在這種情況下,Activity 從 FragmentManager 獲取片段實體并從中讀取更有意義。否則,您必須將 TextWatchers 放在所有 EditText 上,并在每次鍵入字符時傳遞更新的文本,以便 Activity 快取在屬性中。在這種情況下,關注點分離的代價有點高。
uj5u.com熱心網友回復:
我建議使用ViewModel.
ViewModel 類旨在以有生命周期意識的方式存盤和管理 UI 相關資料。ViewModel 類允許資料在配置更改(例如螢屏旋轉)中保留下來。
請參閱https://developer.android.com/topic/libraries/architecture/viewmodel。
然后對標準視圖模型的擴展是共享視圖模型的擴展,其中單個實體可以在多個 Fragment 及其活動之間共享。
https://developer.android.com/topic/libraries/architecture/viewmodel#sharing
這將允許片段更新視圖模型中的某些值,并且活動可以對這些變數的更改做出反應。
使用視圖模型還有許多其他有據可查的好處。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/326500.html
