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>
上述导航图定义了两个页面:HomeFragment
和 DetailsFragment
。@+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"
表示将导航图指定为此导航宿主的导航图。
导航到新页面
在需要导航到新页面的地方,我们可以使用 NavController
的 navigate()
方法来实现。
// MainActivity.java
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
navController.navigate(R.id.fragment_details);
上述代码中,我们首先通过 Navigation.findNavController()
方法获取到当前导航宿主的 NavController
对象。然后,我们使用 navigate()
方法来跳转到 fragment_details
页面。
关闭当前页面
要在跳转到新页面后关闭当前页面,我们可以通过调用 NavController
的 popBackStack()
方法来实现。
// 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