我试图将 Fragment 中的价值传递给其父 Activity (通过父活动是指片段的父活动:片段在父活动中)
我知道我可以使用 ShareViewModel,但我想知道如何使用捆绑包或 Intent 对象解决这个问题。
请告诉我如何解决这个问题。
if (findIdAsync(name, number) != null) {
id = findIdAsync(name, number).toString()
} else {
id = ""
}
findIdAsync 方法如果有进程则返回 id,如果没有则返回“”。
如何将 id 值传递给其父 Activity?
您可以使用接口将数据从片段传递到其父活动。
这是一个例子
创建接口: 在您的片段中定义活动将实现的接口。
interface DataPassListener {
fun onDataPassed(data: String)
}
class MyFragment : Fragment() {
private var dataPassListener: DataPassListener? = null
// Rest of your fragment code
// Call this method when you want to pass data to the activity
private fun passDataToActivity(data: String) {
dataPassListener?.onDataPassed(data)
}
}
在Activity中实现接口: 在您的 Activity 中实现该接口并重写 onDataPassed 方法。
class MyActivity : AppCompatActivity(), DataPassListener {
// Other activity code
override fun onDataPassed(data: String) {
// Handle the passed data in the activity
// You can perform any actions with the received data here
}
}
在Fragment中设置接口: 在片段的 onAttach 方法中,使用以下命令设置 dataPassListener 活动背景。另外,请确保在 onDetach 方法中分离监听器。
class MyFragment : Fragment() {
private var dataPassListener: DataPassListener? = null
override fun onAttach(context: Context) {
super.onAttach(context)
if (context is DataPassListener) {
dataPassListener = context
} else {
throw ClassCastException("$context must implement DataPassListener")
}
}
override fun onDetach() {
super.onDetach()
dataPassListener = null
}
// Rest of your fragment code
// Call this method when you want to pass data to the activity
private fun passDataToActivity(data: String) {
dataPassListener?.onDataPassed(data)
}
}
将数据从 Fragment 传递到 Activity: 现在,您可以在片段中调用 passDataToActivity 方法 想要向活动发送数据。
class MyFragment : Fragment() {
// Other fragment code
private fun someFunction() {
val dataToSend = "Hello, Activity!"
passDataToActivity(dataToSend)
}
}
这样,每当片段调用 passDataToActivity 时,您的 Activity 都会通过 onDataPassed 方法接收数据
我认为正确的方法是使用您提到的 ViewModel 。捆绑包和意图都对您的问题没有用,因为它们的目的完全不同。
虽然bundles用于在fragment或activity之间传递数据,但您无法控制检索数据的时刻,因为您只能在onCreateView等核心生命周期方法中检索它:
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val intFromBundle = savedInstanceState?.getInt("MY_INT_KEY")
...
}
意图对您的问题也没有用。来自文档:
Intent 提供了一种在不同应用程序中的代码之间执行后期运行时绑定的工具。它最重要的用途是启动活动,可以将其视为活动之间的粘合剂。
您可以在此处阅读有关保留 ui 状态的更多信息。
在 Activity 中使用
var yourVariable
并在片段中使用 getActivity().yourVariable
读取/设置它