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)
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报告的错误报告将不会被修复。您可以在此处看到“无法修复(不可行)”状态。
我所做的是等待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)
| 归档时间: |
|
| 查看次数: |
23794 次 |
| 最近记录: |