FragmentContainerView เป็น NavHostFragment


20

ดูเหมือนว่าการใช้FragmentContainerViewไม่ทำงานออกจากกล่องใช่ไหม

<androidx.fragment.app.FragmentContainerView
        class="androidx.navigation.fragment.NavHostFragment"
        android:id="@+id/fragment_nav_host"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/nav_app" />

นี่คือรหัสของฉันโดยใช้fragment-ktx:1.2.0-rc01และฉันเพิ่งได้รับข้อผิดพลาดนี้:

Caused by: java.lang.IllegalStateException: Activity ...MainActivity@797467d does not have a NavController set on 2131296504

เพียงแค่ใช้<fragment>งานและ AFAIK FragmentContainerViewก็ควรเพียงแค่จะถูกแทนที่ด้วย

ฉันไม่มีอะไรหรือไม่ก็ทุกคนสามารถที่จะใช้FragmentContainerViewเป็นNavHostFragment?

ขอบคุณมาก!

คำตอบ:


27

เนื่องจากรายงานข้อผิดพลาดนี้: https://issuetracker.google.com/issues/142847973

วิธีเดียว (ในปัจจุบัน) คือ:

val navHostFragment = supportFragmentManager
    .findFragmentById(R.id.my_nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController

(Java):

NavHostFragment navHostFragment =
    (NavHostFragment) getSupportFragmentManager()
        .findFragmentById(R.id.my_nav_host_fragment);
NavController navController = navHostFragment.getNavController();

2
ดีกว่าที่จะใช้fragmentแทนที่จะกังวลว่าต้องจำวิธีใช้วิธีแก้ปัญหานี้ดีกว่าหรือไม่ เราได้เห็นข้อขัดข้อง แต่สำหรับผู้ใช้บางคนแปลก ๆ ...
hmac

0

สิ่งที่ฉันทำคือรอชิ้นส่วนการนำทางเพื่อขยายมุมมอง:

    super.onCreate(savedInstanceState)

    // Set up the form and list.
    setContentView(R.layout.activity_xxx)

    // Set up navigation - action bar and sidebar.
    /// Let the navigation view check/uncheck the menu items.
    nav_view.post { // wait for NavHostFragment to inflate
        val navController = findNavController()
        nav_view.setupWithNavController(navController)
        nav_view.setNavigationItemSelectedListener(this)
    }


-6

ใช้แทนandroid:name classโรงงาน

<androidx.fragment.app.FragmentContainerView
    android:name="androidx.navigation.fragment.NavHostFragment"
    ...

ฉันได้รับข้อผิดพลาดแม้ใช้android:name
Sam
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.