Navigation その1

2019年5月20日月曜日

Android

t f B! P L

概要

Navigationを使った3画面の遷移。
ボタンを押すと所定の画面に遷移する。

プロジェクトの生成

いつもどおり、Fragment + ViewModelで作ることにする。
  1. Add No Activity ▷ Next
  2. Name: ThreeScreens ▷ Finish
  3. プロジェクトツール ウィンドウで app ▷ java ▷ com...threescreens ▷ New ▷ Activity ▷ Fragment + ViewModel 選択
  4. Configure Activity ダイアログで □Launcher Activity にチェックして Finish 選択

Navigation Graph リソースファイルの作成 - navigation_graph.xml

生成

  1. app ▷ res ▷ New ▷ Android Resource File 選択
  2. New Resource File ダイアログで以下を設定
    • File Name: navigation_graph
    • Resource type: Navigation
  3. 警告が出る。navigation関連のライブラリの dependencyに関するもの。OKを選択。
プロジェクト ウィンドウの res の下に navigation_graph.xmlが生成される。



できた navigation_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"
            android:id="@+id/navigation_graph">

</navigation>


main_activity.xml

  1. app ▷ res ▷ layout ▷ main_activity.xmlをデザインモードで開く
  2. パレットから Containers ▷ NavHostFragment を選択しコンテナ領域にドロップする

  3. Navigation Graphs ダイアログで navigation_graph.xml を選択 ▷ OK

  1. 追加した NavHostFragmentの IDを my_nav_host_fragment とする。

ここまでで  main_activity.xml ファイルはこうなる。


<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
        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/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    <fragment
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" app:navGraph="@navigation/navigation_graph" app:defaultNavHost="true"
            android:id="@+id/my_nav_host_fragment"/>
</FrameLayout>

MainActivity.kt

起動時に man_fragment.xmlが読み込まれないようにするため、MainActivit.ktの以下の5行をコメントアウトする。


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)
        //if (savedInstanceState == null) {
        //    supportFragmentManager.beginTransaction()
        //        .replace(R.id.container, MainFragment.newInstance())
        //        .commitNow()
        //}
    }
}

Navigation Graphリソースファイルの編集 - navigation_graph.xml

host fragmentの追加を確認

HOSTとして上記 my_nav_host_fragmentが設定されちえることを確認する。


Graphにmain_fragmentを追加 

destination 追加アイコンをクリックして、まずは、main_fragmentを追加する。
追加した結果、「家」のアイコンがついている。これは、 start destination であることを表している。




Graphに second_fragment を追加 - fragment_second.xml



  1. New destination アイコンをクリック
  2. Create new destination をクリック
  3. New Android Component ダイアログで次を設定し Finish
    • Fragment Name: SecondFragment
    • Fragment Layout Name: fragment_second




Graphに third_fragment を追加 - fragment_third.xml

上記と同様の方法で third fragmentを追加する

  • Fragment Name: ThirdFragment
  • Fragment Layout Name : fragment_third

Graphに画面遷移の矢印を引く - actionの定義 - navigation_graph.xml

レイアウト デザインの画面で、3つのフラグメントに対して、それぞれ別の2つへの遷移の矢印線を引く。

各矢印が actionになる。 actionも 属性(Attributes)を持つ。IDと遷移先のフラグメントは自動的に割り当てられるので基本的には変更不要。変更しても良い。好き好き。


actionのIDDestination
1 action_mainFragment_to_SecondFragmentsecondFragment
2 action_mainFragment_to_thirdFragment thirdFragment
3 action_secondFragment_to_mainFragmentmainFragment
4 action_secondFragment_to_thirdFragmentthirdFragment
5 action_thirdFragment_to_mainFragment mainFragment
6 action_thirdFragment_to_secondFragmentsecondFragment

以上でレイアウト関連は終わり。

すでに次の3つの Classファイルもできている。

  • MainFragment.kt
  • SecondFragment.kt
  • ThirdFragment.kt

 Kotlin コードの編集は次回。

アーカイブ