【问题标题】:Android Navigation-Component: Back Button not navigating back to viewpager2Android导航组件:后退按钮未导航回viewpager2
【发布时间】:2021-08-02 12:48:57
【问题描述】:

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

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

图形图片(试图从 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))
    }
}

【问题讨论】:

    标签: android kotlin android-architecture-navigation android-navigation android-navigation-graph


    【解决方案1】:

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

    解决方案:在导航之前,重置 livedata。您可以在thisstackoverflow 帖子中看到更多解决方案

    【讨论】:

      猜你喜欢
      • 2019-02-17
      • 2020-05-07
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-11
      相关资源
      最近更新 更多