【问题标题】:FragmentContainerView as NavHostFragmentFragmentContainerView 作为 NavHostFragment
【发布时间】:2020-03-01 08:40:08
【问题描述】:

似乎使用 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

仅使用&lt;fragment&gt; 工作和AFAIK,它应该被FragmentContainerView 替换。

我是否遗漏了什么,或者有人可以将FragmentContainerView 用作NavHostFragment

非常感谢!

【问题讨论】:

    标签: android navigation fragment


    【解决方案1】:

    由于此错误报告: 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();
    

    【讨论】:

    • 使用fragment肯定比担心必须记住使用此解决方法更好?我们看到了崩溃,但仅针对某些用户,很奇怪...
    • @hmac 在链接的问题中,他们讨论了为什么你不应该使用片段:issuetracker.google.com/issues/142847973#comment15Lint 检查正是因为你绝对应该在所有情况下切换到 FragmentContainerView。
    • 不显示任何内容。很奇怪我坚持使用 !
    • 我们对navController的处理,因为变量没有被使用
    【解决方案2】:

    2020 年 8 月更新

    这里是the official Android documentation推荐的解决方案。

    Kotlin 版本:

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

    Java 版本:

    NavHostFragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment);
    NavController navController = navHostFragment.getNavController();
    

    我引用文档:

    使用 FragmentContainerView 创建 NavHostFragment 时 或者如果 通过 a 手动将 NavHostFragment 添加到您的活动中 FragmentTransaction,试图检索NavController 通过 Navigation.findNavController(Activity, @IdRes int) 将失败。您应该直接检索 NavController 而是来自 NavHostFragment。


    Ove Stoerholt 报告的错误报告将不会得到修复。可以看到here“Won't Fix (Infeasible)”状态。

    【讨论】:

    【解决方案3】:

    我所做的是等待NavHostFragment 放大其视图:

    科特林:

    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)
    }
    

    Java8(带有 lambda):

    navigationView.post(() -> { // wait for NavHostFragment to inflate
        navController = Navigation.findNavController(activity, R.id.nav_host_fragment);
        NavigationUI.setupWithNavController(navView, navController);
        navView.setNavigationItemSelectedListener(navItemSelectedListener);
    });
    

    【讨论】:

    • 我使用&lt;fragment&gt; 来避免这个错误。但我被另一个未知的错误困扰。所以我找到了这个@Pnemonic 的最新答案并尝试了它以便使用&lt;FragmentContainerView&gt;。问题已解决,谢谢!
    【解决方案4】:

    我在使用 kotlin 时遇到了同样的问题:

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

    只需添加到

    setupActionBarWithNavController(navController)

    【讨论】:

      【解决方案5】:

      使用android:name 代替class。有效。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-01
        • 1970-01-01
        • 2022-11-14
        • 2022-10-13
        • 2021-01-18
        • 2020-04-04
        • 2018-11-25
        相关资源
        最近更新 更多