Android Navigation: 跳转和关闭当前页

在 Android 应用程序开发中,导航是一个非常重要的方面。导航可以是从一个页面到另一个页面的转换,或者从一个特定的视图到另一个特定的视图。在本文中,我们将讨论如何在 Android 应用程序中实现导航,并且在跳转到新页面后关闭当前页面。

Android Navigation 组件

Android Navigation 组件是 Android Jetpack 中的一部分,它提供了一种简单、一致的方式来实现应用程序导航。它主要由三个关键组件组成:

  • Navigation Graph(导航图):用于定义应用程序的导航结构,包括各个页面和它们之间的关系。
  • NavHost(导航宿主):用于承载导航图中的页面,并根据导航指令切换页面。
  • NavController(导航控制器):用于管理导航图和导航宿主之间的交互。

创建导航图

首先,我们需要创建一个导航图,以定义应用程序的导航结构。导航图是一个 XML 文件,可以通过可视化编辑器或手动编写创建。

<!-- navigation_graph.xml -->
<navigation>
    <fragment
        android:id="@+id/fragment_home"
        android:name="com.example.app.HomeFragment"
        android:label="Home" />

    <fragment
        android:id="@+id/fragment_details"
        android:name="com.example.app.DetailsFragment"
        android:label="Details" />
</navigation>

上述导航图定义了两个页面:HomeFragmentDetailsFragment@+id 是给每个页面分配一个唯一的 ID,这样我们就可以在代码中引用它们。

创建导航宿主

接下来,我们需要在布局文件中创建一个导航宿主,用于承载导航图中的页面。

<!-- activity_main.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:defaultNavHost="true"
    app:navGraph="@navigation/navigation_graph" />

上述布局文件中的 FragmentContainerView 是用于承载页面的容器。app:defaultNavHost="true" 表示将此导航宿主设置为默认的导航宿主。app:navGraph="@navigation/navigation_graph" 表示将导航图指定为此导航宿主的导航图。

导航到新页面

在需要导航到新页面的地方,我们可以使用 NavControllernavigate() 方法来实现。

// MainActivity.java
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
navController.navigate(R.id.fragment_details);

上述代码中,我们首先通过 Navigation.findNavController() 方法获取到当前导航宿主的 NavController 对象。然后,我们使用 navigate() 方法来跳转到 fragment_details 页面。

关闭当前页面

要在跳转到新页面后关闭当前页面,我们可以通过调用 NavControllerpopBackStack() 方法来实现。

// DetailsFragment.java
NavController navController = Navigation.findNavController(getView());
navController.popBackStack();

上述代码中,我们在 DetailsFragment 的代码中获取到当前导航宿主的 NavController 对象。然后,我们使用 popBackStack() 方法来关闭当前页面并返回上一个页面。

完整示例

下面是一个完整的示例,演示了如何实现 Android 导航,并在跳转到新页面后关闭当前页面。

// MainActivity.java
public class MainActivity extends AppCompatActivity {
    NavController navController;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    }

    public void navigateToDetails() {
        navController.navigate(R.id.fragment_details);
    }
}
// DetailsFragment.java
public class DetailsFragment extends Fragment {
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        Button closeButton = view.findViewById(R.id.close_button);
        closeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View