LoginSignup
14
8

More than 3 years have passed since last update.

[Android]Navigation でどこまで戻るか制御する (Pop To と Inclusive)

Last updated at Posted at 2020-01-21

はじめに

Navigation ではどこまで戻るかをPop ToInclusive にて制御できます。
今回は実際にサンプルアプリを作成して、どこまで戻るか制御してみたいと思います。

用語  説明
Pop To Backボタンを押したとき、どこの画面まで戻るか指定できる
Inclusive Pop Upで指定した画面の1つ前に戻るようにする

準備

Navigationをセットアップする

Navigation を利用したアプリケーションを作成するための下準備をします。
次の手順で必要なライブラリやクラス、レイアウトを生成していきます。

build.gradle(app)
dependencies {
    def nav_version = "2.1.0"
    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
    implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
}

Fragment を作成する

Navigation を使った遷移で利用する Fragment を作成していきます。
次の手順で OneFragment, TwoFragment, ThreeFragment の 3つを作成します。

  1. Package Name を右クリックし、New → Fragment → Fragment(Blank) を選択する
  2. Fragment Name任意の名称 を入力し OK を押す
  3. Fragment にいらない記述が書かれているので消す
  4. LayoutFragment に遷移させるための Button を追加する
  5. LayoutFragment を遷移させたときのパラメータを表示されるTextViewを追加する
Fragment.kt
class OneFragment : Fragment() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_one, container, false)
    }
}

image.png

layout.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".OneFragment">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="50dp"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_gravity="bottom"
        android:text="Next" />

</FrameLayout>

実装

次の手順で実装し、Pop ToInclusive の動きを確認して見たいと思います。

No 名称
1 Navigationで画面遷移させる
2 Pop To を利用して指定した画面まで戻る
3 Inclusive で Pop To で指定した画面の1つ前に戻る

Step1 Navigationで画面遷移させる

Safe Argsでパラメータを引き渡すため基本となる画面遷移を実装していきます。

Nav Graph の作成する

nav_graph.xmlを作成し、次の内容のNavigation Editorで記述します。
Nav Graphの作成の詳しい方法はこちらに書いてあるので参考にしてください。

image.png

nav_graph.xml
<?xml version="1.0" encoding="utf-8"?>
<navigation 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:id="@+id/nav_graph"
    app:startDestination="@id/oneFragment">

    <fragment
        android:id="@+id/oneFragment"
        android:name="c.kaleidot725.safeargssample.OneFragment"
        android:label="fragment_one"
        tools:layout="@layout/fragment_one" >
        <action
            android:id="@+id/action_oneFragment_to_twoFragment"
            app:destination="@id/twoFragment" />
    </fragment>
    <fragment
        android:id="@+id/twoFragment"
        android:name="c.kaleidot725.safeargssample.TwoFragment"
        android:label="fragment_two"
        tools:layout="@layout/fragment_two" >
        <action
            android:id="@+id/action_twoFragment_to_threeFragment"
            app:destination="@id/threeFragment" />
    </fragment>
    <fragment
        android:id="@+id/threeFragment"
        android:name="c.kaleidot725.safeargssample.ThreeFragment"
        android:label="fragment_three"
        tools:layout="@layout/fragment_three" />
</navigation>

Nav Hostを作成する

Main ActivityFragmentを表示するためのNav Hostを作成します。

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <fragment
        android:id="@+id/nav_host_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:defaultNavHost="true"
        app:navGraph="@navigation/nav_graph" />
</FrameLayout>

Nav Controller を取得して画面を遷移させる

OneFragment, TwoFragment, ThreeFragment
Nav Controllerを取得して、Buttonで画面遷移できるようにします。

OneFragment.kt
class OneFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_one, container, false)
    }

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

        val b = view.findViewById<Button>(R.id.next_button)
        b.setOnClickListener {
            this.findNavController().navigate(R.id.action_oneFragment_to_twoFragment)
        }
    }
}

いまのところ、こんな感じで動作します。

image.png

Step2 Pop To を利用して指定した画面まで戻る

NavigationPop To を利用するとどこ画面まで戻ることか指定できます。
通常は OneFragmentTwoFragmentThreeFragmentと遷移し Backボタンを押すと TwoFragmentに戻ります。

image.png

image.png

TwoFragmentThreeFragmentの遷移にPop ToOneFramgnetに設定してみます。
OneFragmentTwoFragmentThreeFragmentと遷移しBackボタンを押すと
OneFragmentに戻るようになります。というようにPop To で指定したところまで戻ってくれるようになります。

image.png

image.png

Step3 Inclusive で Pop To で指定した画面の1つ前に戻る

NavigationInclusive を利用すると、Pop Toで指定した画面の1つに戻るようになります。
通常は OneFragmentTwoFragmentThreeFragmentと遷移し Backボタンを押すと TwoFragmentに戻ります。

image.png

image.png

TwoFragmentThreeFragmentの遷移にPop ToOneFramgnetにしInclusiveにチェックを入れます。
OneFragmentTwoFragmentThreeFragmentと遷移しBackボタンを押すと
OneFragmentの1つ前の画面に戻るのでアプリケーションが終了します。

image.png

image.png

Inclusive ですが Pop Toを指定しない場合だと機能しませんので注意が必要です。

おわりに

Pop ToInclusiveが詳しく解説されているところが、
少ないので理解しづらいかと思いますがわかれば簡単ですね。

参考記事

  • Navigationの戻る制御
    • すごくわかりやすいです、本記事はこの記事の補足的な立ち位置で作成しました。
14
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
8