NavController下Fragment设置ID及获取实例返回null的解决方法
问题描述
我创建了导航栏,但不清楚如何在navigation graph中为每个Fragment设置ID。
我的navigation graph代码如下:
<navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/nav_graph" app:startDestination="@id/nav_home"> <fragment android:id="@+id/nav_home" android:name="com.mordechay.yemotapp.HomeFragment" android:label="fragment_home" tools:layout="@layout/fragment_home" > </fragment> <fragment android:id="@id/nav_explorer" android:name="com.mordechay.yemotapp.filseExplorerFragment" android:label="fragment_filse_explorer" tools:layout="@layout/fragment_filse_explorer" /> </navigation>
Activity布局代码:
<fragment android:id="@+id/nvgv_fragment" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintTop_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:defaultNavHost="true" app:navGraph="@navigation/nav_graph" />
我在Activity中编写了如下代码:
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.nav_explorer);
但返回值为null,请问我应该如何正确获取该Fragment实例?我尝试使用navigation graph中Fragment的ID来获取,但结果为null。
解决方案
1. 修正Navigation Graph中Fragment的ID设置
你当前的nav_explorerFragment使用android:id="@id/nav_explorer",这是引用已存在的ID,但该ID并未被创建过。正确的做法是用@+id/前缀创建新的ID资源:
<fragment android:id="@+id/nav_explorer" android:name="com.mordechay.yemotapp.filseExplorerFragment" android:label="fragment_filse_explorer" tools:layout="@layout/fragment_filse_explorer" />
注意:所有需要在代码中引用的Fragment ID,都必须用@+id/xxx格式定义;@id/xxx仅用于引用已经创建好的ID(比如startDestination引用已定义的nav_home)。
2. 正确获取Navigation组件中的Fragment实例
Navigation组件的Fragment嵌套在NavHostFragment内部,不能直接通过Activity的getSupportFragmentManager()查找,必须先获取NavHostFragment,再通过它的子Fragment管理器查找:
// 先获取NavHostFragment NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nvgv_fragment); // 通过NavHostFragment的子Fragment管理器查找目标Fragment Fragment explorerFragment = navHostFragment.getChildFragmentManager().findFragmentById(R.id.nav_explorer);
额外说明:只有当该Fragment已经被导航到(处于活跃状态)时,才能获取到非null的实例。如果nav_explorer还没被切换到,调用上述代码依然会返回null。
内容的提问来源于stack exchange,提问作者Mordechay
相关产品推荐
相关产品推荐

