W swoim działaniu mam kilka fragmentów, z których każdy ma swoje własne Navigation Graph, są one tworzone podczas tworzenia działania. Chcę wiedzieć, jak wybrać którekolwiek z nich jako defaultNavHost lub PrimaryNavigationFragment po ich utworzeniu?

Poniższy kod tworzy je i ustawia jako domyślne, ale nie chcę ich odtwarzać za każdym razem. Jak mogę to zrobić?

val finalHost = NavHostFragment.create(navigation)

supportFragmentManager.beginTransaction()
    .replace(R.id.navFragment0, finalHost)
    .setPrimaryNavigationFragment(finalHost) // this is the equivalent to app:defaultNavHost="true"
    .commit()
1
SIMMORSAL 2 grudzień 2019, 13:38

1 odpowiedź

Najlepsza odpowiedź

Nie udało się znaleźć kodu, aby zrobić to, co chciałem, więc oto moje obejście:

Najpierw usuń #setPrimaryNavigationFragment(finalHost) z transakcji fragmentManager w swoim Kodzie i / lub usuń app:defaultNavHost="true" z <fragment...> w swoim kodzie XML.

Następnie utwórz swoje NavHostFragment i dodaj je do HashMap:

private val navHostFragments = HashMap<Int, NavHostFragment?>()

fun createNavHosts() {
    val finalHost: NavHostFragment =
            NavHostFragment.create(navigationId)
            .also { navHostFragments[aHandleToTheNavHost] = it }
}

Na koniec w onBackPressed pobierz navController odpowiedniego hosta navHost i przejdź do niego:

override fun onBackPressed() {
    if (navHostFragments[aHandleToTheNavHost]?.navController?.navigateUp() == false)
        super.onBackPressed()
}

Uwaga: kiedy #navigateUp() zwraca false, oznacza to, że nie było dokąd nawigować. Możesz więc tam zakończyć ćwiczenie lub cokolwiek innego, co chcesz zrobić.

0
SIMMORSAL 2 grudzień 2019, 14:57