Android 导航组件:后退按钮未导航回 viewpager2

Android Navigation-Component: Back Button not navigating back to viewpager2

我的 viewpager2(页面:UserDataFragment)中有一个 Button,它将用户导航到另一个屏幕(UserDataChangeEmailFragment),他们可以在其中更改他们的密码等。我遇到的问题是此屏幕上的后退按钮不起作用(例如,当用户按下后退和/或工具栏按钮时,用户不会导航回 UserDataFragment)。

我得到的唯一错误是:SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length.

Graph 图片(尝试从 x 导航到 y):

图形结构

UserDataHolderFragment (Holder for the ViewPager2)
 |
 |--UserDataFragment (First Page of the ViewPager2, here is the **Button**)
 |  |
 |  |-- UserDataChangeEmailFragment (Back button not working) 
 |
 |
 |--UserDataAddressFragment (Second Page of the ViewPager2)

图代码(删除了不必要的东西)

<navigation android:id="@+id/nav_user_data"
    app:startDestination="@id/userDataHolderFragment">

    <fragment
        android:id="@+id/userDataHolderFragment"
        android:name="com.rsb3000.app.framework.ui.view.fragment.user.loggedIn.userdata.UserDataHolderFragment"
        tools:layout="@layout/fragment_user_data_holder" >
        <action
            android:id="@+id/action_userDataHolderFragment_to_userDataChangeEmailFragment"
            app:destination="@id/userDataChangeEmailFragment" />
        <action
            android:id="@+id/action_userDataHolderFragment_to_userDataChangePasswordFragment"
            app:destination="@id/userDataChangePasswordFragment" />
    </fragment>

    <fragment
        android:id="@+id/userDataFragment"
        android:name="com.rsb3000.app.framework.ui.view.fragment.user.loggedIn.userdata.UserDataFragment"
        tools:layout="@layout/fragment_user_data">
    </fragment>

    <fragment
        android:id="@+id/userDataAddressFragment"
        android:name="com.rsb3000.app.framework.ui.view.fragment.user.loggedIn.userdata.UserDataAddressFragment"
        tools:layout="@layout/fragment_user_data_address" >
    </fragment>

    <fragment
        android:id="@+id/userDataChangeEmailFragment"
        android:name="com.rsb3000.app.framework.ui.view.fragment.user.loggedIn.userdata.UserDataChangeEmailFragment"
        tools:layout="@layout/fragment_user_data_change_email" />

</navigation>

UserDataHolderFragment 代码(此处为导航按钮)

@AndroidEntryPoint
class UserDataHolderFragment : Fragment(R.layout.fragment_user_data_holder) {
    private val binding: FragmentUserDataHolderBinding by viewBinding(FragmentUserDataHolderBinding::bind)

    val userDataViewPagerAdapter: UserDataViewPagerAdapter get() = UserDataViewPagerAdapter(SnackbarUtils(), this)
    @Inject lateinit var tabLayoutHelper: TabLayoutHelper

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding.headline.userStandardToolbar.setupWithNavController(findNavController(), AppBarConfiguration(findNavController().graph))
        bindObjects()
        bindTablayout()
    }

    private fun bindObjects() {
        with(binding) {
            lifecycleOwner = viewLifecycleOwner
            vpUserData.adapter = userDataViewPagerAdapter
        }
    }

    private fun bindTablayout() {
        tabLayoutHelper.init(binding.tlUserData, binding.vpUserData) { tab, position ->
            when(position) {
                0 -> tab.text = requireContext().getString(R.string.fragment_user_data_holder_user_data_tab)
                1 -> tab.text = requireContext().getString(R.string.fragment_user_data_holder_user_address_tab)
            }
        }
    }

    override fun onDestroyView() {
        super.onDestroyView()
        tabLayoutHelper.onDestroyView()
        binding.vpUserData.adapter = null
    }
}

用户数据片段

private fun bindBtnClicks() {
   btnGoToChangeAddress.setOnClickListener {
       findNavController().navigate(
          UserDataHolderFragmentDirections.actionUserDataFragmentHolderToUserDataChangeEmailFragment()
      )
   }
}

UserDataChangeEmailFragment(后退按钮在这里不起作用)

class UserDataChangeEmailFragment : Fragment(R.layout.fragment_user_data_change_email) {
    private val binding: FragmentUserDataChangeEmailBinding by viewBinding(FragmentUserDataChangeEmailBinding::bind)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding.headline.userStandardToolbar.setupWithNavController(findNavController(), AppBarConfiguration(findNavController().graph))
    }
}

好的,我已经解决了我的错误。这与我的 nav_graph 和片段中的代码无关。问题是我导航到实时数据中的另一个片段。点击后退按钮,立即触发了实时数据的观察,并导航了我一次又一次。

解决方法:导航前,重置livedata。您可以在 this Whosebug post

中查看更多解决方案