web-dev-qa-db-fra.com

Ajouter (pas remplacer) un fragment avec le composant Architecture de navigation

J'ai une activité avec un fragment de liste de produits et de nombreux autres fragments et j'essaie d'utiliser le contrôleur de navigation des composants d'architecture.

Le problème est: il remplace le fragment de liste de produits (destination de départ) et je ne veux pas que la liste soit rechargée lorsque l'utilisateur clique sur le bouton de retour.

Comment effectuer la transaction de fragment en tant qu'addition et non remplacement.

38
mohamed Shater

J'ai rencontré le même problème, en attendant add et d'autres options pour les transactions de fragments, j'ai implémenté ce travail pour préserver l'état lors de la reprise.

J'ai simplement ajouté une vérification si la liaison est présente, puis je rétablis simplement l'état précédent, de même avec l'appel réseau, j'ai ajouté une vérification si les données sont présentes dans le modèle d'affichage, puis ne fais pas la récupération du réseau. Après le test, cela fonctionne comme prévu.

EDIT : Pour la vue recycleur, je pense qu'elle reviendra automatiquement au même état que la liste était avant que vous naviguiez à partir du fragment mais en stockant la position dans le onSavedInstanceSate est également 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)
            }
        }
    }
3
Rainmaker

Le composant de navigation Android vient de remplacer, mais vous voulez ajouter un fragment au lieu de remplacer comme une boîte de dialogue, vous pouvez l'utiliser, mais vous devez min. "Version 2.1." pour le composant de navigation.

Solution

et vous pouvez voir "Destinations de dialogue"

3
UtkuKUTLU

Après avoir cherché un peu, ce n'est pas possible, mais le problème lui-même peut être résolu avec viewmodel et liveata ou rxjava. L'état des fragments est donc conservé après les transactions et ma liste de produits ne se rechargera pas à chaque fois

0
Mohamed Shater

@Rainmaker a raison à mon avis, j'ai fait la même chose. Nous pouvons également enregistrer la position/l'état de la vue du recycleur dans onSaveInstanceState afin de revenir à la même position de la vue du recycleur lorsque vous revenez au fragment de liste.

0
user3193413