I have an activity with a product list fragment and many other fragments and i am trying to use Architecture component navigation controller.
The problem is: it replaces the (start destination)product list fragment and I don't want the list to be reloaded when user click back button.
How to make the fragment transaction as add not replace.
I faced the same problem, while waiting on add
and other options for fragment transactions I implemented this work around to preserve the state when hitting back.
I just added a check if the binding is present then I just restore the previous state, the same with the networking call, I added a check if the data is present in view model then don't do the network refetching. After testing it works as expected.
EDIT:
For the recycler view I believe it will automatically return to the same sate the list was before you navigated from the fragment but storing the position in the onSavedInstanceSate
is also possible
private lateinit var binding: FragmentSearchResultsBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
viewModel =
ViewModelProviders.of(this, mViewModelFactory).get(SearchResultsViewModel::class.java)
return if (::binding.isInitialized) {
binding.root
} else {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_search_results, container, false)
with(binding) {
//some stuff
root
}
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//reload only if search results are empty
if (viewModel.searchResults.isEmpty()) {
args.searchKey.let {
binding.toolbarHome.title = it
viewModel.onSearchResultRequest(it)
}
}
}
After searching a bit, it's not possible, but the problem itself can be solved with viewmodel and livedata or rxjava. So fragment state is kept after transactions and my product list will not reload each time
@Rainmaker is right in my opinion, I did the same thing. We can also save the recycler view position/state in onSaveInstanceState in order to return to the same recycler view position when navigating back to the list fragment.
来源:https://stackoverflow.com/questions/52716962/add-not-replace-fragment-with-navigation-architecture-component