wake-up-neo.com

Fragment durch Navigationsarchitekturkomponente hinzufügen (nicht ersetzen)

Ich habe eine Aktivität mit einem Produktlistenfragment und vielen anderen Fragmenten und versuche, den Navigationscontroller für Architekturkomponenten zu verwenden.

Das Problem ist: Es ersetzt das Produktlistenfragment (Startziel) und ich möchte nicht, dass die Liste neu geladen wird, wenn der Benutzer auf die Schaltfläche "Zurück" klickt.

So machen Sie die Fragmenttransaktion als Hinzufügen nicht Ersetzen.

38
mohamed Shater

Ich hatte das gleiche Problem, als ich auf add und andere Optionen für Fragmenttransaktionen wartete. Ich habe diese Problemumgehung implementiert, um den Status beim Zurückschlagen beizubehalten.

Ich habe gerade eine Überprüfung hinzugefügt, ob die Bindung vorhanden ist, und dann den vorherigen Status wiederhergestellt, genau wie beim Netzwerkaufruf. Ich habe eine Überprüfung hinzugefügt, ob die Daten im Ansichtsmodell vorhanden sind, und dann das Netzwerk nicht erneut abgerufen. Nach dem Testen funktioniert es wie erwartet.

EDIT : Für die Recycler-Ansicht wird sie meiner Meinung nach automatisch in den Zustand zurückkehren, in dem sich die Liste befand, bevor Sie vom Fragment aus navigiert haben, aber die Position in onSavedInstanceSate ist ebenfalls möglich

  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

Android-Navigationskomponente nur ersetzen, aber Sie möchten Fragment hinzufügen, anstatt wie Dialog zu ersetzen. Sie können dies verwenden, müssen aber min. "Version 2.1." für die Navigationskomponente.

Lösung

und Sie können sehen "Dialogziele"

3
UtkuKUTLU

Nach einigem Suchen ist dies nicht möglich, aber das Problem selbst kann mit viewmodel und livingata oder rxjava gelöst werden. Der Fragmentstatus bleibt also nach Transaktionen erhalten und meine Produktliste wird nicht jedes Mal neu geladen

0
Mohamed Shater

@ Regenmacher ist meiner Meinung nach richtig, ich habe das gleiche getan. Wir können auch die Position/den Status der Recycler-Ansicht in onSaveInstanceState speichern, um zur gleichen Position der Recycler-Ansicht zurückzukehren, wenn Sie zurück zum Listenfragment navigieren.

0
user3193413