appモジュールのMainActivityに画面遷移を管理するNavHostを設定します。
: @Composable fun AppNavHost() { }
画面下部に画面遷移用のナビゲーションバーを作成します。
最初にナビゲーションバー用のアイコンをダウンロードします。
今回は、GoogleのMaterial Symbolsから下記のアイコンをダウンロードしました。
ダウンロード後、カッコ内の名前にファイル名を変更します。
Resource Managerツールバーの『ツール(T)』➡『Resource Manager』と進みます。
Resourceの追加Moduleが『app.main』になっていることを確認します。
『+』アイコンをクリックして『Import Drawables』を選択します。
パスの選択ダウンロードしたアイコンファイルを選択します。
『OK』で次に進みます。
アイコンの確認インポートするアイコンを確認します。
『次へ(N)』で次に進みます。
インポートインポートする場所を確認します。
『Import(C)』でアイコンがインポートされます。
ナビゲーションバーに登録するメニューを作成します。
新規リソースファイルの作成appモジュールで右クリック➡『新規(N)』➡『Android Resource File』へと進みます。
リソース情報の入力
Resource Typeを『Menu』にして、任意のFile nameを入力します。
ここでは、bottom_nav_menu にしています。
『OK』でメニューのリソースファイルが作成されます。
作成したリソースファイルを編集します。
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_home" android:icon="@drawable/ic_menu_home" android:title="Home" /> <item android:id="@+id/menu_listing" android:icon="@drawable/ic_menu_listing" android:title="一覧" /> <item android:id="@+id/menu_settings" android:icon="@drawable/ic_menu_settings" android:title="設定" /> </menu>
ナビゲーションバーを作成して、appモジュールのActivityに配置します。
<androidx.constraintlayout.widget.ConstraintLayout ... : <com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/bottom_navigation" android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:menu="@menu/bottom_nav_menu" app:labelVisibilityMode="selected" /> </androidx.constraintlayout.widget.ConstraintLayout>
画面遷移を実装するため、Navigationコンポーネントを導入します。
バージョンカタログにNavigationコンポーネントの情報を追記します。
[versions] : androidx-navigation-ktx = "2.7.7" [libraries] : androidx-navigation-fragment-ktx = { module = "androidx.navigation:navigation-fragment-ktx", version.ref = "androidx-navigation-ktx" } androidx-navigation-ui-ktx = { module = "androidx.navigation:navigation-ui-ktx", version.ref = "androidx-navigation-ktx" } [plugins] : [bundles] : androidx-navigation-ktx = [ "androidx-navigation-fragment-ktx", "androidx-navigation-ui-ktx" ]
追記後、『Sync Now』で内容をプロジェクトに反映させます。
appモジュールのbuild.gradle.ktsにNavigationコンポーネントの依存ライブラリを追記します。
: dependencies { : implementation(libs.bundles.androidx.navigation.ktx) }
追記後、『Sync Now』で内容をプロジェクトに反映させます。
ナビゲーション関連情報を管理するナビゲーショングラフ(Navigation graph)を作成します。
appモジュールで右クリック➡『新規(N)』➡『Android Resource File』でNavigation Resourceを作成します。
リソース情報の入力
Resource Typeを『Navigation』にして、任意のFile nameを入力します。
ここでは、nav_graph にしています。
『OK』でナビゲーションのリソースファイルが作成されます。
作成したリソースファイルを編集します。
<?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/nav_graph" app:startDestination="@id/menu_home" > <fragment android:id="@+id/menu_home" android:name="jp.co.example.android01.ui.home.HomeFragment" /> <fragment android:id="@+id/menu_listing" android:name="jp.co.example.android01.ui.listing.ListingFragment" /> <fragment android:id="@+id/menu_settings" android:name="jp.co.example.android01.ui.settings.SettingsFragment" /> </navigation>
各Fragmentを遷移表示させるためのContainerViewをappモジュールのレイアウトに配置します。
<androidx.constraintlayout.widget.ConstraintLayout ... : <androidx.fragment.app.FragmentContainerView android:id="@+id/fragmentContainerView" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintBottom_toTopOf="@id/bottom_navigation" app:navGraph="@navigation/nav_graph" app:defaultNavHost="true" /> <com.google.android.material.bottomnavigation.BottomNavigationView :
appモジュールのMainActivityに画面遷移を実装します。
: import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.NavigationUI import com.google.android.material.bottomnavigation.BottomNavigationView : class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { : setContentView(R.layout.activity_main) val bottomNavigation = findViewById<BottomNavigationView>(R.id.bottom_navigation) val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragmentContainerView) as NavHostFragment NavigationUI.setupWithNavController(bottomNavigation, navHostFragment.navController) } }