FragmentContainerView 作为 NavHostFragment
FragmentContainerView as NavHostFragment
似乎使用 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>
就可以了,据我所知,它应该被 FragmentContainerView
替换。
我是不是遗漏了什么或者是否有人可以将 FragmentContainerView
用作 NavHostFragment
?
非常感谢!
由于这个错误报告:
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();
使用 android:name
而不是 class
。有效。
<androidx.fragment.app.FragmentContainerView
android:name="androidx.navigation.fragment.NavHostFragment"
...
我所做的是等待 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);
});
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();
我引用文档:
When creating the NavHostFragment using FragmentContainerView or if
manually adding the NavHostFragment to your activity via a
FragmentTransaction, attempting to retrieve the NavController in
onCreate() of an Activity via Navigation.findNavController(Activity,
@IdRes int) will fail. You should retrieve the NavController directly
from the NavHostFragment instead.
Ove Stoerholt 报告的 bug-report 将不会修复。您可以看到 here“无法修复(不可行)”状态。
我在使用kotlin时遇到了同样的问题:
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
只需将其添加到
setupActionBarWithNavController(navController)
似乎使用 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>
就可以了,据我所知,它应该被 FragmentContainerView
替换。
我是不是遗漏了什么或者是否有人可以将 FragmentContainerView
用作 NavHostFragment
?
非常感谢!
由于这个错误报告: 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();
使用 android:name
而不是 class
。有效。
<androidx.fragment.app.FragmentContainerView
android:name="androidx.navigation.fragment.NavHostFragment"
...
我所做的是等待 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);
});
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();
我引用文档:
When creating the NavHostFragment using FragmentContainerView or if manually adding the NavHostFragment to your activity via a FragmentTransaction, attempting to retrieve the NavController in onCreate() of an Activity via Navigation.findNavController(Activity, @IdRes int) will fail. You should retrieve the NavController directly from the NavHostFragment instead.
Ove Stoerholt 报告的 bug-report 将不会修复。您可以看到 here“无法修复(不可行)”状态。
我在使用kotlin时遇到了同样的问题:
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
只需将其添加到
setupActionBarWithNavController(navController)