[学习]JetPack 中的 Navigation(一)

2021-01-28  本文已影响0人  吴敬悦
  1. 先准备 HomeFragmentDetailFragment 两个 Fragment

  2. 新建 navigation 布局文件。在 res 的目录中点击鼠标右键,再点击 new,然后选择 Android Resource File ,这是出现了下面的对话框:

    New Resource File
  3. 点击按钮会自动出现我们新建的 Fragment ,选中添加即可,具体的操作看官方教程

    添加 Fragment
    接下来进行连线,如果希望从 homeFragment 跳转到 detailFragment ,那么就像我图中一样即可。
  4. 将整个 Navigation 添加到 Activity 对应的 xml 布局文件中,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

  <androidx.fragment.app.FragmentContainerView
      android:id="@+id/nav_host_fragment"
      android:name="androidx.navigation.fragment.NavHostFragment"
      android:layout_width="0dp"
      android:layout_height="0dp"
      app:layout_constraintLeft_toLeftOf="parent"
      app:layout_constraintRight_toRightOf="parent"
      app:layout_constraintTop_toTopOf="parent"
      app:layout_constraintBottom_toBottomOf="parent"
      app:defaultNavHost="true"
      app:navGraph="@navigation/stack" />

</androidx.constraintlayout.widget.ConstraintLayout>

其中 app:navGraph="@navigation/stack" 就是上面配置的 navigation 文件名。此时 Activity 已经有这两个页面了。

  1. 实现从 HomeFragment 跳转到 DetailFragment 。虽然在上面已经连接起来了,但这并不代表就能进行跳转,因为并不知道是点击什么进行触发的,此时需要在 HomeFragment 对应的 xml 文件中配置一个按钮:
<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

然后在 HomeFragment.java 文件中添加下面的代码:

@Override
  public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
    super.onViewStateRestored(savedInstanceState);
    Button button = requireView().findViewById(R.id.button);
    button.setOnClickListener((v) -> {
      NavController controller = Navigation.findNavController(v);
      controller.navigate(R.id.toDetailPage);
    });
  }

这里的 NavController 专门负责操作 Navigation 的类。负责跳转的 navigate 的方法:

public void navigate(@IdRes int resId) {
    navigate(resId, null);
}

其中的 resId 可以看先前创建的 navigation/ 下的 xml 文件,点击图中连接的线,然后就可以在 Attributes 中看到 id 的那一栏,里面就有对应的,可以自定义,之前操作的时候会自动生成对应的 id ,这里我自定义为: toDetailPage

上一篇下一篇

猜你喜欢

热点阅读