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
中查看更多解决方案
我的 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
中查看更多解决方案