代码之家  ›  专栏  ›  技术社区  ›  Jimale Abdi Kiwan Park

使用findNavController的FragmentContainerView

  •  0
  • Jimale Abdi Kiwan Park  · 技术社区  · 6 年前

    <fragment> 标记 FragmentContainerView findNavController 不工作,它给我的错误是它没有设置导航控制器

    碎片

    <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:navGraph="@navigation/mobile_navigation" />
    

    活动

    val navController = findNavController(R.id.nav_host_fragment)
        
        val appBarConfiguration = AppBarConfiguration(
            setOf(
                R.id.navigation_classes, R.id.navigation_schedule, R.id.navigation_settings
            )
        )
        setupActionBarWithNavController(navController, appBarConfiguration)
        navView.setupWithNavController(navController)
    }
    
    0 回复  |  直到 6 年前
        1
  •  21
  •   ianhanniballake    6 年前

    根据 this issue FragmentContainerView NavController 使用 findFragmentById() 而不是使用 findNavController() 什么时候进来 onCreate() :

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

    这是因为 findNavController(R.id.nav_host_fragment) 依赖于已经创建的片段的视图,但在使用时不是这样 (当它使用 FragmentTransaction 在引擎盖下面添加 NavHostFragment ).

        2
  •  1
  •   friederbluemle    6 年前

    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    

    具有

    NavController navController = getNavController();
    

    在哪里? getNavController()

        // workaround for https://issuetracker.google.com/issues/142847973
        @NonNull
        private NavController getNavController() {
            Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
            if (!(fragment instanceof NavHostFragment)) {
                throw new IllegalStateException("Activity " + this
                        + " does not have a NavHostFragment");
            }
            return ((NavHostFragment) fragment).getNavController();
        }
    
        3
  •  0
  •   Joao Gavazzi    6 年前

    在公认的答案之外,可以使用的一个小捷径是:

    supportFragmentManager.findFragmentById(R.id.navHostMain)?.findNavController()
    

    当做

    推荐文章