Android Kotlin:未调用接口覆盖函数
Android Kotlin: Interface override function not being called
我有 FragmentA 和 FragmentB。
我正在尝试从 FragmentB
更新 FragmentA 的值
我有一个接口:
interface FragmentCallback {
fun onDataSent(sendUpdatedData: String, position: Int?)
}
在FragmentA中,我覆盖了接口函数。我还实例化了 FragmentB 并调用了 setFragmentCallback 函数
class FragmentA: Fragment(), FragmentCallback {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
FragmentB().setFragmentCallback(this)
}
//This function is not being called from FragmentB...
override fun onDataSent(sendUpdatedData: String, position: Int?) {
updateRecyclerView(sendUpdatedData, position!!)
}
在 FragmentB(位于 FragmentA 之上)中,我实例化了 FragmentCallback 接口。当我完成编辑并弹出片段(backstack)时,我从 FragmentA(onDataSent) 调用覆盖函数。
class FragmentB: Fragment(){
private var fragmentCallback: FragmentCallback? = null
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
btn_save.setOnClickListener{
fragmentCallback?.onDataSent(et_new_text.text.toString(), position )
fragmentManager?.popBackStack()
}
}
fun setFragmentCallback(callback: FragmentCallback?) {
fragmentCallback = callback
}
}
出于某种原因,当我弹出 FragmentB 并通过以下行调用 onDataSent
时:
fragmentCallback?.onDataSent(et_new_text.text.toString(), position)
onDataSent 实际上不会被调用。
你也可以试试这个。
让您的 activity 实现您的界面。
class YourActivity : FragmentCallback{
override fun onDataSent(sendUpdatedData: String, position: Int?) {
// Get Fragment A
val fraga: FragmentA? =
supportFragmentManager.findFragmentById(R.id.fragment_a) as FragmentA?
fraga.updateRecyclerView(sendUpdatedData,position)
}
}
在你的fragmentB中,像这样发送数据。
class FragmentB : Fragment() {
var mCallback: FragmentCallback? = null
override fun onAttach(activity: Activity) {
super.onAttach(activity)
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
mCallback = try {
activity as FragmentCallback
} catch (e: ClassCastException) {
throw ClassCastException(
activity.toString()
+ " must implement TextClicked"
)
}
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
mCallback.onDataSent(et_new_text.text.toString(), position)
fragmentManager?.popBackStack()
}
override fun onDetach() {
mCallback = null // => avoid leaking, thanks @Deepscorn
super.onDetach()
}
}
在你的 FragmentA 中。
class FragmentA : Fragment() {
fun updateRecyclerView(sendUpdatedData: String, position: Int?) {
// Here you'll have it
}
}
在FragmentA
中使用FragmentResultListener
:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setFragmentResultListener("requestKey") { key, bundle ->
val sendUpdatedData = bundle.getString("sendUpdatedData")
// Do something with the result...
}
}
然后在FragmentB
设置结果:
btn_save.setOnClickListener{
val result = et_new_text.text.toString()
setFragmentResult("requestKey", bundleOf("sendUpdatedData" to result))
...
}
old-fashioned way uses the Activity
to communicate between two fragments. You could also use a shared ViewModel 共享数据。
我有 FragmentA 和 FragmentB。 我正在尝试从 FragmentB
更新 FragmentA 的值我有一个接口:
interface FragmentCallback {
fun onDataSent(sendUpdatedData: String, position: Int?)
}
在FragmentA中,我覆盖了接口函数。我还实例化了 FragmentB 并调用了 setFragmentCallback 函数
class FragmentA: Fragment(), FragmentCallback {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
FragmentB().setFragmentCallback(this)
}
//This function is not being called from FragmentB...
override fun onDataSent(sendUpdatedData: String, position: Int?) {
updateRecyclerView(sendUpdatedData, position!!)
}
在 FragmentB(位于 FragmentA 之上)中,我实例化了 FragmentCallback 接口。当我完成编辑并弹出片段(backstack)时,我从 FragmentA(onDataSent) 调用覆盖函数。
class FragmentB: Fragment(){
private var fragmentCallback: FragmentCallback? = null
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
btn_save.setOnClickListener{
fragmentCallback?.onDataSent(et_new_text.text.toString(), position )
fragmentManager?.popBackStack()
}
}
fun setFragmentCallback(callback: FragmentCallback?) {
fragmentCallback = callback
}
}
出于某种原因,当我弹出 FragmentB 并通过以下行调用 onDataSent
时:
fragmentCallback?.onDataSent(et_new_text.text.toString(), position)
onDataSent 实际上不会被调用。
你也可以试试这个。
让您的 activity 实现您的界面。
class YourActivity : FragmentCallback{
override fun onDataSent(sendUpdatedData: String, position: Int?) {
// Get Fragment A
val fraga: FragmentA? =
supportFragmentManager.findFragmentById(R.id.fragment_a) as FragmentA?
fraga.updateRecyclerView(sendUpdatedData,position)
}
}
在你的fragmentB中,像这样发送数据。
class FragmentB : Fragment() {
var mCallback: FragmentCallback? = null
override fun onAttach(activity: Activity) {
super.onAttach(activity)
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
mCallback = try {
activity as FragmentCallback
} catch (e: ClassCastException) {
throw ClassCastException(
activity.toString()
+ " must implement TextClicked"
)
}
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
mCallback.onDataSent(et_new_text.text.toString(), position)
fragmentManager?.popBackStack()
}
override fun onDetach() {
mCallback = null // => avoid leaking, thanks @Deepscorn
super.onDetach()
}
}
在你的 FragmentA 中。
class FragmentA : Fragment() {
fun updateRecyclerView(sendUpdatedData: String, position: Int?) {
// Here you'll have it
}
}
在FragmentA
中使用FragmentResultListener
:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setFragmentResultListener("requestKey") { key, bundle ->
val sendUpdatedData = bundle.getString("sendUpdatedData")
// Do something with the result...
}
}
然后在FragmentB
设置结果:
btn_save.setOnClickListener{
val result = et_new_text.text.toString()
setFragmentResult("requestKey", bundleOf("sendUpdatedData" to result))
...
}
old-fashioned way uses the Activity
to communicate between two fragments. You could also use a shared ViewModel 共享数据。