0

我在does not have a NavController setOnBackPressedCallback 中遇到错误。这是代码

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

    fragmentView = inflater.inflate(R.layout.patient_info_fragment, container, false)

    if(Utils.connectedToInternet()){
        fragmentView.pastScreeningsButton.visibility = View.GONE
    }

    requireActivity().onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
                Navigation.findNavController(fragmentView).navigate(R.id.action_patientInfoFragment_to_patientsList)
        }
    })
    setHasOptionsMenu(true)


    return fragmentView
}

当我回到实现它的片段时,我只会收到这个错误。

我有android:name="androidx.navigation.fragment.NavHostFragment"在家里的片段。

澄清一下,我正在使用导航控制器围绕我的应用程序进行所有导航,它工作得很好。我只在其中得到这个错误,OnBackPressedCallback并且只有当用户导航回实现它的片段时。

如果您需要查看我的更多代码,请告诉我。

4

2 回答 2

5

您可能会遇到片段旧实例泄漏的问题。此外,将创建的视图存储在另一个变量(如fragmentView. 总而言之,您的onCreateView实现做了太多与其目的无关的事情。

我建议将功能拆分为相关的生命周期方法并fragment.view直接在回调中使用。为了不遇到未附加视图的问题,您可以将回调与生命周期绑定和解除绑定。

class PatientInfoFragment: Fragment() {

    private val callback = object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            Navigation.findNavController(view).navigate(R.id.action_patientInfoFragment_to_patientsList)
        }
    }

    override fun onCreate(
        savedInstanceState: Bundle?
    ) {
        super.onCreate(savedInstanceState)
        setHasOptionsMenu(true)
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View = inflater.inflate(R.layout.patient_info_fragment, container, false)

    override fun onViewCreated(
        view: View,
        savedInstanceState: Bundle?
    ) {
        if(Utils.connectedToInternet()){
            view.pastScreeningsButton.visibility = View.GONE
        }
    }

    override fun onStart() {
        super.onStart()
        requireActivity().onBackPressedDispatcher.addCallback(callback)
    }

    override fun onStop() {
        callback.remove()
        super.onStop()
    }
}

回调生命周期绑定可以与片段绑定,作为生命周期所有者调用另一个addCallback(LifecycleOwner, OnBackPressedCallback)

此外,您可以查看Android KTXKotlin Android Extensions以简化您的实施。

于 2019-06-18T13:58:57.843 回答
0

将您的代码移入onViewCreated并传递view覆盖方法提供的代码:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        requireActivity().onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
                Navigation.findNavController(view).navigate(R.id.action_patientInfoFragment_to_patientsList)
        }
    })
    }

如果这也不起作用,请将 替换为.navigate()popBastack(R.id.framgment_where_you_want to go, false)以防您之前的片段留在backStack

于 2019-06-18T14:11:56.373 回答