findNavController
是 Android Jetpack Navigation 组件中的一个重要方法,用于在 Fragment 之间进行导航。FragmentContainerView
是一个用于托管 Fragment 的视图容器,通常与 Navigation 组件一起使用。
NavController
配合使用。findNavController
方法可以在 Fragment 中获取到当前 Fragment 所在的 NavController
实例。FragmentContainerView
是一个视图容器,用于托管 Fragment。NavController
是 Navigation 组件的核心类,负责管理导航逻辑。findNavController
方法时返回 null?原因:通常是因为 FragmentContainerView
没有正确配置或初始化。
解决方法:
FragmentContainerView
,并为其设置了正确的 android:name
属性,例如:<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:navGraph="@navigation/nav_graph" />
NavController
,例如:NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
findNavController
方法,请确保该方法在 onViewCreated
或之后的生命周期方法中调用,因为在此之前 FragmentContainerView
可能尚未初始化。以下是一个简单的示例,展示了如何在 Fragment 中使用 findNavController
进行导航:
布局文件 (fragment_home.xml):
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:navGraph="@navigation/nav_graph" />
导航图 (nav_graph.xml):
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/nav_graph"
app:startDestination="@id/homeFragment">
<fragment
android:id="@+id/homeFragment"
android:name="com.example.HomeFragment"
android:label="Home" />
<fragment
android:id="@+id/detailFragment"
android:name="com.example.DetailFragment"
android:label="Detail" />
</navigation>
HomeFragment.java:
public class HomeFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_home, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// 获取 NavController 实例
NavController navController = Navigation.findNavController(view);
// 设置点击事件进行导航
Button button = view.findViewById(R.id.button);
button.setOnClickListener(v -> navController.navigate(R.id.action_homeFragment_to_detailFragment));
}
}
参考链接:
没有搜到相关的文章