Androidで簡易コーポレートサイト（アプリ）を作成する #1 -タブバー編-

# 概要
簡易コーポレイトサイトアプリをAndroidで作成していきます。
まず、Tabナビゲーションを作成します。

# プロジェクト作成
Android Studioを立ち上げて[New Project]をクリックしてプロジェクトを作成します。
[Empty Activity]を選択して[Next]をクリックします。
<img width="1132" alt="000001.jpg" src="https://dl.dropbox.com/s/l8plekidt2cnjy0/000001.jpg">
Nameを好きなものに変更（AndroidWebsiteとしました）して、LanguageがKotlinとなっていることを確認して[完了]をクリックします（保存場所はお好みで）。Minimum SDKバージョンは何％のデバイスで動作するか、許容できる範囲の最新バージョンを確認して選びます。今回は「API 28:Android 9.0(Pie)」を選択しました。
<img width="968" alt="000010.jpg" src="https://dl.dropbox.com/s/oz07kgp2vkx93se/000010.jpg">
> 参考（2022年10月22日時点）
><img width="500" alt="000020.jpg" src="https://dl.dropbox.com/s/x3z2yzrb7uo2wxz/000020.jpg">

すこしするとプロジェクトが立ち上がります。
## 確認
右上の「▶」をクリックするとエミュレータが立ち上がり現状を確認できます。
<img width="1414" alt="000030.jpg" src="https://dl.dropbox.com/s/z6ykttc9vpuv6ls/000030.jpg">
<img width="1460" alt="000040.jpg" src="https://dl.dropbox.com/s/re2rqzrdaxmtib3/000040.jpg">

確認できたら「■」をおして一旦停止して、エミュレータをとじます。

# Tab作成
## ファイル確認
まず、AndroidStudioを確認すると、中央にファイルが２つすでに開かれている状態であります。
<img width="1715" alt="000050.jpg" src="https://dl.dropbox.com/s/0nf2d686lasnha9/000050.jpg">

それぞれ

- MainActivity.kt
  アプリのエントリポイントで、ユーザーから見えない機能部分を実装するファイル
- activity_main.xml
レイアウトを定義する XML ファイル

となっています。主に追加していくファイルとこの２つのファイルを編集していきます。

## デフォルトレイアウト削除
activity_main.xmlを開いて、デフォルトのレイアウト消してみます。
上部でactivity_main.xmlを選択するとファイルの中身が表示されます。
AndroidStudioで編集する際に表示するレイアウトを「Split」にしておくと、Codeをデザインも確認できるので「Split」にしておきます。<img width="1786" alt="000060.jpg" src="https://dl.dropbox.com/s/s0ydt0n73knb7fu/000060.jpg">

右側のデザインから「Hello World」を選択してDeleteキーで削除します。
<img width="1786" alt="000070.jpg" src="https://dl.dropbox.com/s/o60ls70qmohn81t/000070.jpg">

するとコード上からもTextViewが消えてデフォルトのTextViewを消すことができました。
<img width="1786" alt="000080.jpg" src="https://dl.dropbox.com/s/3x367soiomuvkxf/000080.jpg">

## BottomNavigationView追加
paletteの検索窓に「BottomNavigationView」と入力してBottomNavigationViewを見つけ、デザインにドラックアンドドロップします。
<img width="2037" alt="000090.jpg" src="https://dl.dropbox.com/s/mykmwblyxy040jl/000090.jpg">

すると、コードにも追加されました。
<img width="2037" alt="000100.jpg" src="https://dl.dropbox.com/s/f0c72lyqlkqw85m/000100.jpg">

BottomNavigationViewが選択されている状態で右側のAttributesを開きLayoutで下・左・右のレイアウトの調整をします。
上下左右に「＋」が表示されていますが、下・左・右の「＋」をクリックして「0」を設定します。
（下に表示したいので下の余白は０、左右も０にします。）
<img width="878" alt="000110.jpg" src="https://dl.dropbox.com/s/xeln77hboyl9dww/000110.jpg">

次に、Layout_widthとLaout_heightをコードから編集します。（AttributeからでもOK）
widthは横幅いっぱいにしたいのでmatch_parent、heightはコンテンツ（メニュー）の高さに合わせるようにします。

```diff_xml: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">

    <com.google.android.material.bottomnavigation.BottomNavigationView
+       android:layout_width="match_parent"
+       android:layout_height="wrap_content"
-       android:layout_width="xxxdp"
-       android:layout_height="xxxdp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
```

```kotlin:コピペ用
<com.google.android.material.bottomnavigation.BottomNavigationView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />
```
するとレイアウトもシュッと下の方に設定されたのがわかります。
<img width="2073" alt="000120.jp" src="https://dl.dropbox.com/s/fi9lo3q3q9yp16y/000120.jpg">

## Navigation作成
左側の「ResourceManager」を開いて「Navigation」を選択します。
<img width="2073" alt="000130.jpg" src="https://dl.dropbox.com/s/f0ij6v7adp1wyij/000130.jpg">
「+」から「Navigation Resouce File」をクリックします。
<img width="647" alt="000140.jpg" src="https://dl.dropbox.com/s/158ygtm2r79kd80/000140.jpg">

「my_nav」という名前を指定して「OK」をクリックします。
<img width="936" alt="000150.jpg" src="https://dl.dropbox.com/s/poxgveduz9lig7u/000150.jpg">

注意が表示されますが、「OK」をクリックします。
<img width="486" alt="000160.jpg" src="https://dl.dropbox.com/s/8j0sunvakq8sysp/000160.jpg">


## Navigationの行き先（HomeとContact）作成
行き先を作成していきます。
中央上部の「+」をクリックします。
<img width="2073" alt="000170.jpg" src="https://dl.dropbox.com/s/14p5gqch8ntuoaq/000170.jpg">

「Create New Destination」をクリックします。
<img width="2073" alt="000180.jpg" src="https://dl.dropbox.com/s/s9vklp1wk81oj5u/000180.jpg">

Fragment（Blank）を選択してNextをクリックします。
<img width="1012" alt="000190.jpg" src="https://dl.dropbox.com/s/un8wh01vh8l9nj3/000190.jpg>

こちらをTop画面用にしたいので「TopFragment」という名前に指定して「Finish」をクリックします。
<img width="1012" alt="000200.jpg" src="https://dl.dropbox.com/s/8awoql3zuw9ghmv/000210.jpg">

同様の手順で「ContactFragment」も作成します。
<img width="1012" alt="000210.jpg" src="https://dl.dropbox.com/s/3xvimdlvpaldm0y/000220.jpg">

するとこんな感じの画面になっているはずです。
<img width="2073" alt="000230.jpg" src="https://dl.dropbox.com/s/fn0liwzeog1ljzg/000230.jpg">


## activity_main.xml編集
いま作成したFragmentを表示するようにactivity_main.xmlを開いて「NavHostFragment」を追加します。
「NavHostFragment」を検索し、ドラッグアンドドロップします。
<img width="2073" alt="000240.jpg" src="https://dl.dropbox.com/s/90bz1ni7bbiae4o/000240.jpg">

ダイアログが出たら、作成した「my_nav」を選択して「OK」をクリックします。
<img width="986" alt="000250.jpg" src="https://dl.dropbox.com/s/pao2100vb3xih50/000250.jpg">

Layoutから上下左右のレイアウトを「＋」をクリックして調整（すべて0に）します。
また`android:layout_width`に値が入っていますが、`android:layout_width="match_parent"`に変更します。
<img width="2073" alt="000260.jpg" src="https://dl.dropbox.com/s/j9xmx9863412dyc/000260.jpg">


## Menu作成
ナビゲーションを表示するメニューを作成します。
左側の「ResourceManager」を開いて「Menu」を選択します。
<img width="1958" alt="000270.jpg" src="https://dl.dropbox.com/s/bv128ww9kedpxdm/000270.jpg">

「+」から「Menu Resouce File」をクリックします。
<img width="836" alt="000280.jpg" src="https://dl.dropbox.com/s/be7jf7cf0hi2g62/000280.jpg">

「bottom_menu」という名前で作成します。
<img width="892" alt="000290.jpg" src="https://dl.dropbox.com/s/nurtyakc1gg82vz/000290.jpg">

paletteから「MenuItem」を選択してドラッグ・アンド・ドロップします。
<img width="2073" alt="000300.jpg" src="https://dl.dropbox.com/s/vrxqw8tpwhi3zjl/000300.jpg">

これを２回繰り返し、デザインに2つItemというmenuができればOKです。
<img width="2073" alt="000310.jpg" src="https://dl.dropbox.com/s/x7egq9byossz6of/000310.jpg">

### アイコン追加
アイコンでHOME用の家のアイコンとContact用のメールのアイコンをDrawbleに追加していきます。
左側から「Drawble」を選択します。
<img width="1958" alt="000320.jpg" src="https://dl.dropbox.com/s/ei6o2703vjor12w/000320.jpg">

「+」ボタンで「Vector Asset」をクリックします。
 <img width="844" alt="000330.jpg" src="https://dl.dropbox.com/s/b33tb8kcphoimuw/000330.jpg">
ダイアログのClip Artをクリックします。
<img width="812" alt="000340.jpg" src="https://dl.dropbox.com/s/l6j5tpzsh8pj07u/000340.jpg">
検索窓に「Home」と入力してアイコンを探します。選択したら「OK」をします。
<img width="712" alt="000350.jpg" src="https://dl.dropbox.com/s/8fdbold7ccdabv2/000350.jpg">
アイコンが表示されているのを確認し、Nameを「home」に変更して手順にそってすすめて登録します。（名前は変更しなくてもいいのですが、コード追加が手間でなくわかりやすいように変更しました）
<img width="812" alt="000360.jpg" src="https://dl.dropbox.com/s/1z8s691nxycxflx/000360.jpg">
<img width="812" alt="000370.jpg" src="https://dl.dropbox.com/s/ypjclvu7ucctckp/000370.jpg">

同様の手順でメールアイコン（emailと検索）も追加します。名前は「email」に変更します。左側に追加されたのを確認します。
<img width="687" alt="000380.jpg" src="https://dl.dropbox.com/s/4qovggyoc7aupc3/000380.jpg">


### アイコン設定
Projectに戻って、bottom_menu.xmlを開きます（res>menu>bottom_menu.xml）。「split」で表示させて、コードを編集します。
<img width="2073" alt="000390.jpg" src="https://dl.dropbox.com/s/aii7yajmehcb047/000390.jpg">

android:iconで追加したアイコンを指定し、android:titleも変更します。また、それぞれFragmentとリンクさせるためandroid:idでFragmentのIDを指定します。

```diff_xml:bottom_menu.xml
    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android">

-       <item android:title="Item" />
-       <item android:title="Item" />
+       <item android:id="@+id/topFragment" android:title="Top" android:icon="@drawable/home" />
+       <item android:id="@+id/contactFragment" android:title="Contact" android:icon="@drawable/email" />
    </menu>
```

```kotlin:コピペ用
<item android:id="@+id/topFragment" android:title="Top" android:icon="@drawable/home" />
<item android:id="@+id/contactFragment" android:title="Contact" android:icon="@drawable/email" />
```
FragmentのIDはmy_nav.xml（res>navigation>my_nav.xml）から確認できます。
<img width="2073" alt="000400.jpg" src="https://dl.dropbox.com/s/ovh6g0qfhkyibsu/000400.jpg">



### activity_main.xml編集
activity_main.xmlに戻って、bottomNavigationViewにapp:menuを追加します。

```diff_xml: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">

	    <com.google.android.material.bottomnavigation.BottomNavigationView
	        android:id="@+id/bottomNavigationView"
	        android:layout_width="match_parent"
	        android:layout_height="wrap_content"
	        app:layout_constraintBottom_toBottomOf="parent"
	        app:layout_constraintEnd_toEndOf="parent"
	        app:layout_constraintStart_toStartOf="parent" 
-	        />
+	        app:menu="@menu/bottom_menu" />

	    <androidx.fragment.app.FragmentContainerView
	        android:id="@+id/fragmentContainerView"
	        android:name="androidx.navigation.fragment.NavHostFragment"
	        android:layout_width="0dp"
	        android:layout_height="0dp"
	        app:defaultNavHost="true"
	        app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView"
	        app:layout_constraintEnd_toEndOf="parent"
	        app:layout_constraintStart_toStartOf="parent"
	        app:layout_constraintTop_toTopOf="parent"
	        app:navGraph="@navigation/my_nav" />
	</androidx.constraintlayout.widget.ConstraintLayout>
```
<img width="2073" alt="000410.jpg" src="https://dl.dropbox.com/s/n07fzt0kbvyo98l/000410.jpg">


レイアウト上はtabメニューが設置されました。

### プログラム追加
レイアウト上はtabメニューが設置されましたがプログラムを記述していないため、エミュレータで動かしても、画面が遷移することはありません。
プログラムを追加します。
findByIdとfindFragmentByIdでbottomNavigationViewとfragmentContainerViewを取得して、setupWithNavControllerで設定します。

```diff_kotlin:MainActivity.kt
    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)

+           val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottomNavigationView)
+           val navController = supportFragmentManager.findFragmentById(R.id.fragmentContainerView)

+           bottomNavigationView.setupWithNavController(navController!!.findNavController())
        }
    }
```
```kotlin:コピペ用
val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottomNavigationView)
val navController = supportFragmentManager.findFragmentById(R.id.fragmentContainerView)

bottomNavigationView.setupWithNavController(navController!!.findNavController())
```

上記コードをコピペすると、文字が赤くなる部分があります。赤い文字にカーソルを合わせるとUnresolved referenceと表示されています。「Import」をクリックして利用できるように設定します。

<img width="1828" alt="000420.jpg" src="https://dl.dropbox.com/s/mg1etjigk116sn3/000420.jpg">

<img width="1684" alt="000430.jpg" src="https://dl.dropbox.com/s/l7au0a7jl00p852/000430.jpg">

<img width="1651" alt="000440.jpg" src="https://dl.dropbox.com/s/n33r6p2lwu13yap/000440.jpg">

すると、上部のImportにコードが追加され、赤文字のエラーが消えます。
<img width="2073" alt="000450.jpg" src="https://dl.dropbox.com/s/ubyrvlwigrpwvyz/000450.jpg">


この状態でエミュレータを起動して確認するとTopとContactのアイコンをクリックするごとに画面遷移しています（表示がないのでよくわかりません）が、ヘッダ部分の表示に変更がないのでこちらも変えます。

```diff_kotlin:MainActivity.kt
    package com.example.simpleweb

    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import androidx.navigation.fragment.findNavController
    import androidx.navigation.ui.AppBarConfiguration
    import androidx.navigation.ui.setupActionBarWithNavController
    import androidx.navigation.ui.setupWithNavController
    import com.google.android.material.bottomnavigation.BottomNavigationView

    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)

            val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottomNavigationView)
            val navController = supportFragmentManager.findFragmentById(R.id.fragmentContainerView)

+           val appBarConfiguration = AppBarConfiguration(setOf(R.id.homeFragment,R.id.contactFragment))
+           setupActionBarWithNavController(navController!!.findNavController(),appBarConfiguration)
            
            bottomNavigationView.setupWithNavController(navController!!.findNavController())
        }
    }
```
```kotlin:コピペ用
val appBarConfiguration = AppBarConfiguration(setOf(R.id.topFragment,R.id.contactFragment))
setupActionBarWithNavController(navController!!.findNavController(),appBarConfiguration)
```
こちらも同様に赤文字をImportをして追加してください。
エミュレータを立ち上げてみるとタイトルがfragment_topとfragment_contactで切り替わっているのがわかります。
<img width="2073" alt="000460.jpg" src="https://dl.dropbox.com/s/lioqkcp11emhv4f/000460.jpg">

タイトルをTopとContactに変更します。
my_nav.xmlを開いて、コードを変更します。

```diff_xml:my_nav.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/my_nav"
        app:startDestination="@id/homeFragment">

        <fragment
            android:id="@+id/homeFragment"
            android:name="com.example.simpleweb.HomeFragment"
-           android:label="fragment_top"
+           android:label="Top"
            tools:layout="@layout/fragment_home" />
        <fragment
            android:id="@+id/contactFragment"
            android:name="com.example.simpleweb.ContactFragment"
-           android:label="fragment_contact"
+           android:label="Contact"
            tools:layout="@layout/fragment_contact" />
    </navigation>
```
エミュレータで変更されたことが確認できます。
<img width="2073" alt="000470.jpg" src="https://dl.dropbox.com/s/ioe55h7cgr80icx/000470.jpg">
<img width="2073" alt="000480.jpg" src="https://dl.dropbox.com/s/clyky5yb9c3vrdt/000480.jpg">
これでTabの完成です。

# 関連コンテンツ
* 次：[Androidで簡易コーポレートサイト（アプリ）を作成する #2 -TOP画面とContact画面編-](https://qiita.com/minimumskills/private/c39c04dec69a0021d96c)
* [超シンプルなWeb（アプリ）作成を通して各種フロントエンド技術を体験する - 2023 Early -](https://qiita.com/minimumskills/private/9e7efe86e244bb9844b0)