Android 如何在kotlin中获取片段之间的回调

Android 如何在kotlin中获取片段之间的回调,android,android-fragments,kotlin,Android,Android Fragments,Kotlin,我试图在kotlin中从一个子片段回调到父片段,然后在稍后调用父片段中的函数来管理子片段中的其他布局 我知道如何从片段回调到活动,并在回调中访问片段中的函数,但在Kotlin中我们无法做到这一点,因为伴随对象 另一种方法是将片段的上下文传递给子片段,并使用onAttach()中的片段内容实现接口,但我无法通过构造函数传递父片段的上下文,因为我使用的是工厂静态方法 我们将非常感谢您的帮助 子片段:DriverStatusFragment.kt companion object { @J

我试图在kotlin中从一个子片段回调到父片段,然后在稍后调用父片段中的函数来管理子片段中的其他布局

我知道如何从片段回调到活动,并在回调中访问片段中的函数,但在Kotlin中我们无法做到这一点,因为伴随对象

另一种方法是将片段的上下文传递给子片段,并使用
onAttach()
中的片段内容实现接口,但我无法通过构造函数传递父片段的上下文,因为我使用的是工厂静态方法

我们将非常感谢您的帮助

子片段:
DriverStatusFragment.kt

  companion object {
    @JvmStatic
    fun newInstance() =
        DriverStatusFragment().apply {
            arguments = Bundle().apply {
            }
        }
}

override fun onAttach(context: Context) {
    super.onAttach(context)

    if (context is OnCurrentOrderStatusChanged) {
        orderStatusChangedCallBack = context
    }
}

private fun handleUserOnlineStatus(isOnline: Boolean) {
    CustomPreferences.setBooleanPreference(context!!, PrefEntity.IS_ONLINE, isOnline)

    when (isOnline) {
        true -> {
            binding.idOnlineStatus.text = getString(R.string.online)
            binding.idOnlineStatusImage.setImageResource(R.drawable.circle_green)

            //testing:
            orderStatusChangedCallBack?.orderStatusChanged(CONSTANTS.NEW_ORDER)
        }
        false -> {
            binding.idOnlineStatus.text = getString(R.string.offline)
            binding.idOnlineStatusImage.setImageResource(R.drawable.circle_gray)
        }
    }
}
class HomeFragment : Fragment(), OnMapReadyCallback, OnCurrentOrderStatusChanged {

companion object {
    @JvmStatic
    fun newInstance() =
        HomeFragment().apply {
            arguments = Bundle().apply {
            }
        }
}

fun handleOrderStatus(status: String) {

    when (status) {
        CONSTANTS.IDLE -> {
            replaceFragment(
                DriverStatusFragment.newInstance(),
                DriverStatusFragment::class.java.simpleName
            )
        }

        CONSTANTS.NEW_ORDER -> {
            replaceFragment(
                NewOrderFragment.newInstance(false),
                NewOrderFragment::class.java.simpleName
            )
        }

        CONSTANTS.ORDER_ACCEPTED -> {
            replaceFragment(
                EnRouteFragment.newInstance(CONSTANTS.ORDER_ACCEPTED),
                EnRouteFragment::class.java.simpleName
            )
        }

        CONSTANTS.ARRIVED_AT_DROP_LOCATION -> {
            replaceFragment(
                OrderDeliveredFragment.newInstance(CONSTANTS.ARRIVED_AT_DROP_LOCATION),
                OrderDeliveredFragment::class.java.simpleName
            )
        }

        CONSTANTS.DELIVERED -> {
            replaceFragment(
                DriverStatusFragment.newInstance(),
                DriverStatusFragment::class.java.simpleName
            )
        }
    }


override fun onAttach(context: Context) {
    super.onAttach(context)
    this.context = context
}

**NOT RECEIVING CALLBACK HERE**

override fun orderStatusChanged(orderStatus: String) {
    CommonUtils.showToast(context!!, "REAched here")
    handleOrderStatus(orderStatus)
}



}
父片段:
HomeFragment.kt

  companion object {
    @JvmStatic
    fun newInstance() =
        DriverStatusFragment().apply {
            arguments = Bundle().apply {
            }
        }
}

override fun onAttach(context: Context) {
    super.onAttach(context)

    if (context is OnCurrentOrderStatusChanged) {
        orderStatusChangedCallBack = context
    }
}

private fun handleUserOnlineStatus(isOnline: Boolean) {
    CustomPreferences.setBooleanPreference(context!!, PrefEntity.IS_ONLINE, isOnline)

    when (isOnline) {
        true -> {
            binding.idOnlineStatus.text = getString(R.string.online)
            binding.idOnlineStatusImage.setImageResource(R.drawable.circle_green)

            //testing:
            orderStatusChangedCallBack?.orderStatusChanged(CONSTANTS.NEW_ORDER)
        }
        false -> {
            binding.idOnlineStatus.text = getString(R.string.offline)
            binding.idOnlineStatusImage.setImageResource(R.drawable.circle_gray)
        }
    }
}
class HomeFragment : Fragment(), OnMapReadyCallback, OnCurrentOrderStatusChanged {

companion object {
    @JvmStatic
    fun newInstance() =
        HomeFragment().apply {
            arguments = Bundle().apply {
            }
        }
}

fun handleOrderStatus(status: String) {

    when (status) {
        CONSTANTS.IDLE -> {
            replaceFragment(
                DriverStatusFragment.newInstance(),
                DriverStatusFragment::class.java.simpleName
            )
        }

        CONSTANTS.NEW_ORDER -> {
            replaceFragment(
                NewOrderFragment.newInstance(false),
                NewOrderFragment::class.java.simpleName
            )
        }

        CONSTANTS.ORDER_ACCEPTED -> {
            replaceFragment(
                EnRouteFragment.newInstance(CONSTANTS.ORDER_ACCEPTED),
                EnRouteFragment::class.java.simpleName
            )
        }

        CONSTANTS.ARRIVED_AT_DROP_LOCATION -> {
            replaceFragment(
                OrderDeliveredFragment.newInstance(CONSTANTS.ARRIVED_AT_DROP_LOCATION),
                OrderDeliveredFragment::class.java.simpleName
            )
        }

        CONSTANTS.DELIVERED -> {
            replaceFragment(
                DriverStatusFragment.newInstance(),
                DriverStatusFragment::class.java.simpleName
            )
        }
    }


override fun onAttach(context: Context) {
    super.onAttach(context)
    this.context = context
}

**NOT RECEIVING CALLBACK HERE**

override fun orderStatusChanged(orderStatus: String) {
    CommonUtils.showToast(context!!, "REAched here")
    handleOrderStatus(orderStatus)
}



}

在这里可以找到一个很好的例子,只需使用?@sadat谢谢你的指导!。成功了!非常感谢你。