はじめに
Jetpack
の Navigation
はすごく便利ですよね。
最近ちょくちょく利用するのですが実装の仕方を忘れてしまいます。
なので忘れても Navigation
を最速で実装できるようにするため、
1つの Activity
で 複数のFragment
を切り替えるアプリの作成方法をまとめます。
準備
Navigation
を利用したアプリケーションを作成するための下準備をします。
次の手順で必要なライブラリやクラス、レイアウトを生成していきます。
Navigation
をセットアップする
次の内容を dependencies
に記述するとNavigation
をインストールできます。
Java
と Kotlin
でインストール方法が違うので注意が必要です。
dependencies {
def nav_version = "2.1.0"
implementation "androidx.navigation:navigation-fragment:$nav_version"
implementation "androidx.navigation:navigation-ui:$nav_version"
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
}
Fragment
を作成する
Navigation
を使った遷移で利用する Fragment
を作成していきます。
次の手順で OneFragment
, TwoFragment
, ThreeFragment
の 3つを作成します。
-
Package Name
を右クリックし、New → Fragment → Fragment(Blank)
を選択する -
Fragment Name
に任意の名称
を入力しOK
を押す -
Fragment
にいらない記述が書かれているので消す -
Layout
にFragment
に遷移させるためのButton
を追加する
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)
}
}
<?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">
<Button
android:id="@+id/nav_button"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_blank_fragment" />
</FrameLayout>
実装
Navigation
を利用するには次の3つを実装する必要があります。
それらの 3 つの実装を 1 つずつ進めていきます。
No | 名称 | 役割 |
---|---|---|
1 |
Navigation Graph の作成 |
宛先などナビゲーションの情報を管理する XML ファイルを作成する |
2 |
Nav Host の作成 |
Nav Host はNavigation Graph の宛先を表示するための空のコンテナのことFragment を表示するのでNavHost の実装であるNavHostFragment を作成する |
3 |
Nav Controller で画面を遷移させる |
Nav Host に表示するコンテンツをNavigation Graph を元に切り替える処理をする Nav Controller を取得し、画面を遷移させる。 |
Navigation Graph の作成
宛先などのナビゲーション情報を管理するNavigation Graph
を作成します。
リソースファイルの作成
Navigation Graph
はどこからどこへ遷移するかをリソースファイルに記述したものです。
なのでまずはNavigation Graph
のリソースファイルを作成します。
-
res
を右クリックしNew → Android Resource File
を選択する -
File name
にnav_graph
,Resource Type
にNavigation
を入力する
遷移先の組み立て
作成した nav_graph
を開くとNavigation Editor
が表示されます。
この Navigation Editor
を利用して、どこからどこへ遷移するかを決めていきます。
次の操作でどこからどこへ遷移するか設定できます。今回はOneFragment
から TwoFragment
、
TwoFragment
からThreeFragment``ThreeFragment
からOneFragment
に遷移させます。
- 📱をクリックして
OneFragment
,TwoFragment
,ThreeFragment
を追加する -
OneFragment
からTwoFragment
,TwoFramgent
からThreeFragment
、ThreeFragment
からOneFragment
に線を引く
Nav Host
の作成
Navigation Graph
で定義したコンテンツを表示するための空のコンテナを作成します。
Activity
のレイアウトにfragment
を追加した後、
次のAttribute
を追加することでNav Host Fragment
を定義できます。
Attribute | Value | 説明 |
---|---|---|
android:name | NavHostFragment | どのNavHost の実装を利用するか指定できる。今回は Fragment を表示するためのNavHostFragment を指定する。 |
app:navGraph | @navigation/nav_graph | どのNavigation Graph を利用するか設定できる。今回はさっき作成した Navigation Graph をここで指定する。 |
app:defaultNavHost | true |
NavHostFragment がBACK ボタンを無効化できる。今回は BACK ボタンでホームに戻りたくないので有効化しておく |
<?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
で画面を遷移させる
Nav Controller
を取得し、Button
をクリックした時にFragment
を遷移させる処理を実装する。
Nav Controller
を取得する
Nav Controller
を取得する方法は 3つあります。
次のように Fragment
か View
, Activity
から取得する方法があります。
Fragment.findNavController()
View.findNavController()
Activity.findNavController(viewId: Int)
Nav Controller
で遷移する
Nav Controller
を取得したら Navigate
で画面を遷移できます。
このNavigate
の引数にはID
指定し、どこからどこへ遷移するか指定します。
このID
ですがNav Graph
を設定するNavigation Editor
で矢印をクリックすると確認できます。
NavController.navigate(ID)
説明したNav Controller
を取得する方法とNav Controller
で遷移する方法を組み合わせて
次のようにFragment
にコードを実装すれば画面遷移できるようになります。
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)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Fragment を使った Nav Controller の取得
val navController = this.findNavController()
val button = view.findViewById<Button>(R.id.nav_button)
button.setOnClickListener {
navController.navigate(R.id.action_oneFragment_to_twoFragment)
}
// View を使った Nav Controller の取得
val button = view.findViewById<Button>(R.id.nav_button)
button.setOnClickListener { view ->
val navController = view.findNavController()
navController.navigate(R.id.action_oneFragment_to_twoFragment)
}
}
}
動作確認
実装が完了したらアプリケーションをインストールして動作確認します。
ボタンをクリックすると次のFragment
に遷移できてますね。
おわりに
Navigation
は複雑そうに見えますが簡単です。
これからはNavigation
で簡単に早く画面遷移を実装しましょう。