0

我正在成功使用 viewBinding 并且以前从未遇到过这个问题。该属性在 onViewCreated 中初始化,如下所示:

private lateinit var viewBinding: FragmentMainBinding

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    // Create a binding object to the layout
    viewBinding = FragmentMainBinding.bind(view)
}

然后我有一个打开相机的按钮,就像这样(也在 onViewCreated 中):

// Button to open camera
viewBinding.takePictureButton.setOnClickListener {
    findNavController().navigate(R.id.action_main_fragment_to_camera)
}

我的主要片段实现了在相机片段中声明的接口函数。这是为了知道用户是选择了图像还是在没有选择图像的情况下关闭了相机。像这样:

// Interface declared in CameraFragment
interface ImageCaptureListener {
    fun onUserDismissedCamera(userPickedImage: Boolean)
}

// Implementation of interface function in main fragment
override fun onUserDismissedCamera(userPickedImage: Boolean) {
    if(userPickedImage) {
        println("User picked image")
        
        //** The app crashes when trying to set image in viewBinding.mainFragmentImageView

    } else {
        println("User did NOT picked image")
    }
}

我的 viewBinding 属性怎么不能在这里初始化?显然是在导航到相机片段时。这是某种生命周期问题吗?导航到相机时是否取消初始化?

感谢任何指示。

4

1 回答 1

0

当您导航到另一个 Fragment 时,视图被破坏,因此绑定不再有效。通常这可以通过在 Fragment 中设置retainInstance为来解决,但它现在已被弃用(虽然我不同意弃用,但谷歌菜鸟只认为应用程序只能是简单的,所以现在重新加载复杂的布局将是一件昂贵的事情)。您可以使用,或将回调返回的照片对象设置为某个变量,并在调用 onCreateView 时设置它。trueonViewCreatedretainInstance

于 2021-05-12T11:45:21.830 回答