目的

Navigationコンポーネントを使えばFragment間の遷移も簡単で分かりやすく処理できるということで使ってみました。

環境

  • Android Studio 3.6.1
  • kotlin 1.3.50

参照サイト

Android developers Navigation コンポーネント スタートガイド

JetpackのNavigationコンポーネントの所感

メモの前にJetpackのNavigationコンポーネントを使ってみての所感を書きます。

  • 些細なことですが、これを利用するにはライブラリとして追加する必要がある
  • アルファ版なのでこれから仕様が大きく変わる可能性がある
  • Android10にもなるタイミングでこの変更具合というかやっと完成系になりつつあるのかとかちょっとうんざりする
  • 設定するファイル(管理するファイル)が増える
  • 多少グラフィカルな設定を行う必要がある
  • ↑なので、画面遷移はコマンド上がやるのが正義!という人は取っ付きづらい
  • 実際に遷移する時に利用するコマンド量は少量で使いやすい。不具合も出しづらい構造(だと思う)
  • Fragmentの気持ち悪い挙動というか分かるづらさというか、そういうのが今の所ない

など多少Android全体への思いも含めてますが、多々挙げられます。
ちなみにこのNavigationコンポーネントは2018年のGoogleフォーラムでアナウンスがあったとのこと。

また、Fragmentの気持ち悪い挙動については以下のリンクで記載しています。 https://reftec.work/posts/2019/11/139/

以下より、Navigationコンポーネントを導入するメモとなります。

まず、build.gradle(Module: app)に以下を追加します。
バージョン値はたびたび変わるようで、ワーニングとなるかもしれません。

build.gradle設定
    def nav_version = "2.3.0-alpha04"
    // Kotlin
    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
    implementation "androidx.navigation:navigation-ui-ktx:$nav_version"

Android Studioの左ペインより新規でResourseFileを作成

Navigationを選択

上部メニューアイコンで+のアイコンをクリックでFragmentを新規作成します。

Fragmentの名前設定とかです。

BlankFragment1BlankFragment2を作りました。

BlankFragment1をクリックしてBlankFragment2にドラッグします。

ここで一回ビルドした方が良いと思います。
Navigationの設定をktファイルから参照しようとした時、このままだとうまくできません。
ビルドすることで参照できるようになる感がありました。

ktファイルの設定

作られたBlankFragment1.ktに以下を追加
作られたBlankFragment2に遷移するようにします。

BlankFragment1
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        buttonnext.setOnClickListener {
            Navigation.findNavController(it).navigate(R.id.blankFragment2)
        }
    }

作られたBlankFragment2.ktに以下を追加
BlankFragment1.ktに戻るようにします。

BlankFragment2
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        buttonback.setOnClickListener {
            Navigation.findNavController(it).popBackStack()
        }
    }

activity_main.xmlは以下としました。

activity_main.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">

    <fragment
        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/nav_graph" />

</androidx.constraintlayout.widget.ConstraintLayout>

挙動

後ほど