目的
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コンポーネントを導入する
以下より、Navigationコンポーネントを導入するメモとなります。
まず、build.gradle(Module: app)
に以下を追加します。
バージョン値はたびたび変わるようで、ワーニングとなるかもしれません。
def nav_version = "2.3.0-alpha04"
// Kotlin
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
navigationの設定
Android Studioの左ペインより新規でResourseFileを作成
Navigationを選択
上部メニューアイコンで+のアイコンをクリックでFragmentを新規作成します。
Fragmentの名前設定とかです。
BlankFragment1
とBlankFragment2
を作りました。
BlankFragment1
をクリックしてBlankFragment2
にドラッグします。
ここで一回ビルドした方が良いと思います。
Navigationの設定をktファイルから参照しようとした時、このままだとうまくできません。
ビルドすることで参照できるようになる感がありました。
ktファイルの設定
作られたBlankFragment1.ktに以下を追加
作られたBlankFragment2に遷移するようにします。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
buttonnext.setOnClickListener {
Navigation.findNavController(it).navigate(R.id.blankFragment2)
}
}
作られたBlankFragment2.ktに以下を追加
BlankFragment1.ktに戻るようにします。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
buttonback.setOnClickListener {
Navigation.findNavController(it).popBackStack()
}
}
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>
挙動
後ほど