FragmentContainerView 作为 NavHostFragment

Kur*_*sta 75 navigation android fragment

似乎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" />
Run Code Online (Sandbox Code Playgroud)

这是我使用的代码fragment-ktx:1.2.0-rc01,我总是收到此错误:

Caused by: java.lang.IllegalStateException: Activity ...MainActivity@797467d does not have a NavController set on 2131296504
Run Code Online (Sandbox Code Playgroud)

仅使用<fragment>作品和 AFAIK,它应该被替换为FragmentContainerView.

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

非常感谢!

Ove*_*olt 103

由于此错误报告:https : //issuetracker.google.com/issues/142847973

这是唯一的方法(目前):

val navHostFragment = supportFragmentManager
    .findFragmentById(R.id.my_nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
Run Code Online (Sandbox Code Playgroud)

(爪哇):

NavHostFragment navHostFragment =
    (NavHostFragment) getSupportFragmentManager()
        .findFragmentById(R.id.my_nav_host_fragment);
NavController navController = navHostFragment.getNavController();
Run Code Online (Sandbox Code Playgroud)

  • 使用“片段”肯定比担心必须记住使用此解决方法更好吗?我们看到了崩溃,但仅限于某些用户,很奇怪...... (9认同)
  • @hmac在链接的问题中,他们讨论了为什么你不应该使用fragment:https://issuetracker.google.com/issues/142847973#comment15:*Lint检查正是因为你绝对应该在所有情况下切换到FragmentContainerView .* (3认同)

Vin*_*nce 28

2020 年 8 月更新

下面是Android官方文档推荐的解决方案。

科特林版本:

val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
Run Code Online (Sandbox Code Playgroud)

爪哇版:

NavHostFragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment);
NavController navController = navHostFragment.getNavController();
Run Code Online (Sandbox Code Playgroud)

我引用文档:

当使用 FragmentContainerView 创建 NavHostFragment通过 FragmentTransaction手动将 NavHostFragment 添加到您的活动时,尝试通过 Navigation.findNavController(Activity, @IdRes int)检索活动的 onCreate() 中的NavController 将失败。您应该直接从 NavHostFragment 检索 NavController。


Ove Stoerholt报告的错误报告将不会被修复。您可以在此处看到“无法修复(不可行)”状态。

  • 虽然原始任务被标记为“无法修复(不可行)”,但他们确实链接到另一个任务,因此他们可能计划解决该问题:https://issuetracker.google.com/issues/143145612 (2认同)

Pne*_*nic 6

我所做的是等待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)
}
Run Code Online (Sandbox Code Playgroud)

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);
});
Run Code Online (Sandbox Code Playgroud)