Bir NavHost için görünüm olarak <androidx.fragment.app.FragmentContainerView> vs <fragment>


11

Kullanırken androidx.fragment.app.FragmentContainerViewyerine normal bir navHost olarak fragmentapp yönü değiştirildikten sonra bir hedefe gitmenize mümkün değildir.

Aşağıdaki hatayı alıyorum: java.lang.IllegalStateException: no current navigation node

Düzgün kullanmak için bilmem gereken bir gotcha var mı veya nav bileşenlerini kullanma yöntemim yanlış mı?

Manzaralı basit etkinlik xml:


...
    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        app:navGraph="@navigation/nav_simple" />
...

Gezinme kodu:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_legislator.xml"
    app:startDestination="@id/initialFragment">

    <fragment
        android:id="@+id/initialFragment"
        android:name="com.example.fragmenttag.InitialFragment"
        android:label="Initial Fragment"
        tools:layout="@layout/initial_fragment">
        <action
            android:id="@+id/action_initialFragment_to_destinationFragment"
            app:destination="@id/destinationFragment" />
    </fragment>
    <fragment
        android:id="@+id/destinationFragment"
        android:name="com.example.fragmenttag.DestinationFragment"
        android:label="Destination Fragment"
        tools:layout="@layout/destination_fragment" />

</navigation>

İşte bir hatayı kolayca yeniden oluşturabileceğiniz bir github repo: https://github.com/dmytroKarataiev/navHostBug


Sen koymak gerekir <fragmentbir içine FragmentContainerView.
EpicPandaForce

Yanıtlar:


19

no current navigation nodeOrada hiçbir grafik seti var ve aramak çalıştığınızda hata oluşur navigate(). Sadece kullandığınız zaman oluşursa FragmentContainerViewve bir yapılandırma değişikliğinden sonra, o zaman bu ilgili olacak Bu hata sabit ve Navigasyon 2.2.0-rc03 ile girmesi planlanıyor.

Bu soruna geçici bir çözüm bulmak için, geri dönebilir <fragment>veya kaldırabilir app:navGraph="@navigation/nav_simple"ve bunun yerine çağrı yapabilirsiniz navController.setGraph(R.navigation.nav_simple).


Aslında bu yaklaşımı denedim ve aynı hatayı aldım. Repoyu kontrol edebilir ve bu yaklaşımla çalışmasını sağlayabilir misiniz?
Dmytro Karataiev

Ayrıca, bu çökme yalnızca yönlendirme değişikliğinden sonra gerçekleşir. Diğer tüm zamanlarda çalışır.
Dmytro Karataiev

Aslında bunun aynı hata olmadığını düşünüyorum, nav denetleyicisi sorumda null değil, ancak arka yığını boş ve grafik null.
Dmytro Karataiev

Ah, evet, bu oldukça önemli bir bilgi, Yaşadığınız şey bu diğer sorun . Bu konuda neler olduğunu tartışmak için cevabımı güncelledim.
ianhanniballake

Teşekkürler, mükemmel.
Dmytro Karataiev

0

Fragment görünümünü FragmentContainerView ile değiştirmenin neden bir açıklama görmüyorum . Bu yüzden bu yanıtı ekleyin:

Bir etkinlikte fragmanları barındırmak için yaygın kalıplardan biri FrameLayout kullanmaktır. Android topluluğu bunu yıllardır yapıyor ancak bu şimdi değişecek. Androidx ekibi sizin için bunu yapmak için FragmentContainerView adlı bu yeni görünümü tanıttı.

Yapmanız gereken tek şey FrameLayout'unuzu FragmentContainerView ile değiştirmek ve her şey kutunun dışında çalışmalı, parça işlemlerini gerçekleştirme şeklinizde herhangi bir şeyi değiştirmeniz gerekmeyecek.

Burada elde edilen faydalar, fragmanlar için z-düzeni olarak adlandırılan şeyin iyileştirilmiş kullanımıdır. İşte kullandıkları örnek, ancak temel olarak bu, örneğin, iki parça arasındaki çıkış ve giriş geçişlerinin birbiriyle çakışmayacağı anlamına gelir. Bunun yerine bu FragmentContainerView önce çıkış animasyonunu, ardından enter animasyonunu başlatacaktır.

İsterseniz bu etiketin yerini alabilir mi? o zaman cevap evet. Yapmanız gereken tek şey FragmentContainerView tanımlarken android: name = "your_class_name" eklemektir ve parçanızı oluşturmak ve göstermek için başlık altında bir FragmentTransaction kullanır. Bu, parça işlemlerini daha sonra değiştirmek için kullanabileceğiniz anlamına gelir.

Kaynak

Android Dokümanları


1
Bunun yazarın sorduğu soruya cevap verdiğine inanmıyorum.
AlgoRyan

1
Hala iyi bir ek bilgi.
Rvb84
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.