我有一個帶按鈕的對話框。我想在單擊按鈕并關閉對話框時更改父片段中的 TextView (txtTotalDist)。
我嘗試了幾種方法都沒有成功:
rootView.btnDialogOK.setOnClickListener {
val frag: ParentFragment()
frag.txtTotalDist.text="A"
//Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
(activity as ParentFragment).txtTotalDist.post { txtTotalDist.text = "A" }
//cannot be cast to ParentFragment
txtTotalDist.post { txtTotalDist.text = "A" }
//Attempt to invoke virtual method 'boolean android.widget.TextView.post(java.lang.Runnable)' on a null object reference
txtTotalDist.text = "A"
//Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
dismiss()
}
我還試圖在父片段中找到一個函式來覆寫,例如 onAttach、onResume、onStart、onViewStateRestored,但是當我關閉對話框時它們都沒有啟動。我怎樣才能正確地做到這一點?
編輯/解決方案
build.gradle 模塊:
implementation 'androidx.fragment:fragment-ktx:1.4.0'
主機片段:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setFragmentResultListener("requestKey") { key, bundle ->
val result = bundle.getString("action")
if (result=="del") refreshStatusBar()
}
}
對話片段:
rootView.btnDialogRemove.setOnClickListener {
setFragmentResult("requestKey", bundleOf("action" to "del"))
dismiss()
}
uj5u.com熱心網友回復:
如果第二個片段嵌套在第一個片段中,您可以將回呼傳遞給第二個片段并在關閉對話框后呼叫它,或者您可以從第二個片段回傳一個可觀察物件以供第一個觀察。但是,如果您設計的片段彼此同級,則取決于您設計的代碼庫。如果您直接使用片段管理器,則可以執行與上述相同的方法并添加第二個片段而不是替換它。但是如果你必須更換或者你正在使用導航組件,有一個更好的方法來處理它,就像我們在兩個活動之間所做的那樣。您可以將以下代碼行添加到第一個片段:
setResultListener("yourKey") { key, Any ->
val result = anything you need to return
//Todo something about result
}
在第二個活動中,當您想在關閉對話框后或任何時候設定資料時:
val result = any result
setResult("yourKey",result)
您也可以查看以下網址以獲取有關它的更多資訊。 https://developer.android.com/training/basics/fragments/pass-data-between#kotlin
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/365463.html
