美文网首页
[学习]JetPack 中的 Navigation(一)

[学习]JetPack 中的 Navigation(一)

作者: 吴敬悦 | 来源:发表于2021-01-28 22: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

    相关文章

      网友评论

          本文标题:[学习]JetPack 中的 Navigation(一)

          本文链接:https://www.haomeiwen.com/subject/levxtltx.html