Próbowałem znaleźć metodę w nowych komponentach nawigacji, ale nic o tym nie znalazłem.

Mam obecne miejsce docelowe z:

mainHostFragment.findNavController().currentDestination

Ale nie mogę uzyskać żadnego odniesienia do wyświetlanego fragmentu.

20
BenjaminBihr 5 czerwiec 2018, 00:46

6 odpowiedzi

Najlepsza odpowiedź

Nawigacja nie zapewnia żadnego mechanizmu do uzyskania implementacji (tj. Sam fragment) bieżącego miejsca docelowego.

Zgodnie z Tworzenie zwrotów zdarzeń do aktywności, powinieneś komunikować się ze swoim fragmentem przez

  • Posiadanie fragmentu rejestruje połączenie w swoim metodzie {X0}}, odlewając aktywność do instancji interfejsu, który zapewniasz
  • Użyj wspólnego ViewModel, że Twoja aktywność i fragment użycia komunikować się.
29
ianhanniballake 4 czerwiec 2018, 22:25

Możesz zrobić coś takiego:

  override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        val navHostFragment = supportFragmentManager.fragments.first() as? NavHostFragment
        if(navHostFragment != null) {
            val childFragments = navHostFragment.childFragmentManager.fragments
            childFragments.forEach { fragment ->
                fragment.onActivityResult(requestCode, resultCode, data)
            }
        }
    }

Ale dla bardziej zaawansowanych słuchaczy komunikacyjnych metodami zwrotnymi zarejestrowanych w fragment.onattach () ({x0}}) i SharedViewmodel ({x1 }}, ważne, aby mieć ViewModelProviders, and Lifecycle owner that is scoped to getActivity() raczej)

19
Michał Ziobro 22 sierpień 2018, 08:18

Odniesienie do wyświetlanego fragmentu (Androidx):

public Fragment getForegroundFragment(){
    Fragment navHostFragment = getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
    return navHostFragment == null ? null : navHostFragment.getChildFragmentManager().getFragments().get(0);
}

Tutaj nav_host_fragment to identyfikator znacznik fragment w activity_main.xml za pomocą android:name="androidx.navigation.fragment.NavHostFragment"

5
isabsent 11 grudzień 2019, 06:11

Korzystanie z odpowiedzi Michal napisałem tę funkcję rozszerzenia do testowania:

@Suppress("UNCHECKED_CAST")
fun <F : Fragment> AppCompatActivity.getFragment(fragmentClass: Class<F>): F? {
    val navHostFragment = this.supportFragmentManager.fragments.first() as NavHostFragment

    navHostFragment.childFragmentManager.fragments.forEach {
        if (fragmentClass.isAssignableFrom(it.javaClass)) {
            return it as F
        }
    }

    return null
}

Używane w ten sposób:

val myFragment = activity.getFragment(MyFragment::class.java)
3
CampbellMG 16 listopad 2018, 02:57

Na podstawie innych odpowiedzi

Fragment navHostFragment = getSupportFragmentManager().getPrimaryNavigationFragment();
Fragment fragment = navHostFragment.getChildFragmentManager().getFragments().get(0);

((Your Fragment Class) fragment).(public method inside the fragment)

Pracował dla mnie

4
Eren Tüfekçi 31 grudzień 2019, 22:50

Z działalności, która ma navhostfragment, poniżej fragmentu kodu może być użyty do pobrania instancji aktywnego fragmentu.

val currentFragment 
           = mNavHostFragment?.childFragmentManager?.primaryNavigationFragment
0
Coder 17 maj 2020, 16:15