画面遷移と値受け渡し

##はじめに
今回は画面遷移と値の受け渡しについて実装していきます。

![スクリーンショット 2021-08-18 22.42.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704865/f5be9147-150a-4724-907f-38149cadc727.png)

リストの各行に格納されている商品をアップすると画面が遷移し、
タップした商品が遷移先の画面に表示する機能を実装していきます。
![スクリーンショット 2021-08-18 22.45.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704865/91c0bd3d-c309-3094-3482-f0f26a7901b8.png)

##実装
```Kotlin:string.xml
<resources>
    <string name="app_name">画面遷移サンプル</string>
    <string name="tv_thx_title">注文完了</string>
    <string name="tv_thx_desc">以下のメニューのご注文を受け付けました。御注文有り難う御座います。</string>
    <string name="bt_thx_back">リストに戻る</string>
</resources>

```
まずstring.xmlファイルはこの様な感じ

続いてMainのxmlファイルはListViewを配置します

```Kotlin:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<ListView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/lvMenu"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   />

```

##MainActivityの処理

```Kotlin:MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //画面部品ListViewを取得
        val lvMenu = findViewById<ListView>(R.id.lvMenu)
        //Simple Adapterで使用するMutableListオブジェクトを用意
        val menuList : MutableList<MutableMap<String,String>> = mutableListOf()

        //「食パン」のデータを格納するMapオブジェクトの用意とmenuListへのデータ登録
        var menu = mutableMapOf("name" to "食パン","price" to "120円")
        menuList.add(menu)
        //「揚げパン」のデータを格納するMapオブジェクトの用意とmenuListへのデータ登録
         menu = mutableMapOf("name" to "揚げパン","price" to "130円")
        menuList.add(menu)
        //「ジャムパン」のデータを格納するMapオブジェクトの用意とmenuListへのデータ登録
         menu = mutableMapOf("name" to "ジャムパン","price" to "110円")
        menuList.add(menu)
        //「アンパン」のデータを格納するMapオブジェクトの用意とmenuListへのデータ登録
         menu = mutableMapOf("name" to "アンパン","price" to "130円")
        menuList.add(menu)
        //「カレーパン」のデータを格納するMapオブジェクトの用意とmenuListへのデータ登録
         menu = mutableMapOf("name" to "カレーパン","price" to "140円")
        menuList.add(menu)
        //「メロンパン」のデータを格納するMapオブジェクトの用意とmenuListへのデータ登録
         menu = mutableMapOf("name" to "メロンパン","price" to "150円")
        menuList.add(menu)

        //SimpleAdapter第４引数fromデータの用意
        val from = arrayOf("name","price")
        //SimpleAdapter第５引数データの用意
        val to = intArrayOf(android.R.id.text1,android.R.id.text2)
        //SimpleAdapterを生成
        val adapter = SimpleAdapter(this@MainActivity,menuList,android.R.layout.simple_list_item_2,from,to)
        //アダプタの登録
        lvMenu.adapter = adapter

        //リストタップのリスナラス登録
        lvMenu.onItemClickListener = ListItemClickListener()

    }
   />

```


商品名と金額をListViewのアダプターに格納します

```Kotlin
 //リストタップのリスナラス登録
 lvMenu.onItemClickListener = ListItemClickListener()

```
上記をOnCreateメソッド内に記述する事でListViewのアイテムがタップされた時の処理が走る様になります

##ListItemClickListener

```Kotlin:MainActivity.kt
 //リストがタップされた時の処理が記述されたメンバクラス
    private inner class ListItemClickListener : AdapterView.OnItemClickListener{
        override fun onItemClick(parent: AdapterView<*>, view: View, position: Int, id: Long) {

            //タップされた行のデータを取得。SimpleAdapterでは1行分のデータはMutableMap型
            val item = parent.getItemAtPosition(position) as MutableMap<String,String>
            //食品名と金額を取得
            val menuName = item["name"]
            val menuPrice = item["price"]

            //インデントオブジェクトを生成
            val intent2MenuThanks = Intent(this@MainActivity,MenuThanksActivity::class.java)

            //第二画面に送るデータを格納
            intent2MenuThanks.putExtra("menuName",menuName)
            intent2MenuThanks.putExtra("menuPrice",menuPrice)
            //第二画面の起動
            startActivity(intent2MenuThanks)

        }
    }

```
詳しく見ていきます

```Kotlin
val item = parent.getItemAtPosition(position) as MutableMap<String,String>
```
上記の記述でタップしたアイテムが何行目なのかと、食品名と金額を取り出しています

```Kotlin
 //第二画面に送るデータを格納
 intent2MenuThanks.putExtra("menuName",menuName)
 intent2MenuThanks.putExtra("menuPrice",menuPrice)
 //第二画面の起動
 startActivity(intent2MenuThanks)
```
上記ではタップしたアイテムの食品名と金額を遷移先のActivityに渡そうとしています。
そして、startActivity(intent2MenuThanks)で遷移先に処理が流れます

##遷移先のActivity

```Kotlin:activity_menu_thanks.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:text="@string/tv_thx_title"
        android:gravity="center"
        android:textSize="25sp"
         />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:text="@string/tv_thx_desc"
        android:textSize="15dp"
        />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/tvMenuName"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            />
        <TextView
            android:id="@+id/tvMenuPrice"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBackButtonClick"
        android:text="@string/bt_thx_back"/>
</LinearLayout>

```
この画面では食品名と金額の表示やMain画面に戻るボタンが表示

```Kotlin:MenuThanksActivity
 class MenuThanksActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_menu_thanks)

        //リスト画面から渡されたデータを取得
        val menuName = intent.getStringExtra("menuName")
        val menuPrice = intent.getStringExtra("menuPrice")

        //食品名と金額を表示させるTextViewを取得
        val tvMenuName = findViewById<TextView>(R.id.tvMenuName)
        val tvMenuPrice = findViewById<TextView>(R.id.tvMenuPrice)

        //TextViewに食品名と金額を表示
        tvMenuName.text = menuName
        tvMenuPrice.text = menuPrice

    }
    //戻るボタンをタップした時の処理
    fun onBackButtonClick(view: View){
        finish()
    }
}
```

上記では食品名と金額を遷移前のActivityから受け取っている処理や
受け取った食品名と金額を表示、それからボタンを押すとMainの画面に戻る処理が記述されています。

##さいごに
仕事でJavaを扱っていますが、やっぱKotlinめちゃめちゃいいですね〜、、
個人的にアプリ開発していますが、楽しすぎて時間を忘れてしまい、画面眩しいからはよ寝ろと嫁に怒られアセアセ（汗）

皆さん、家族サービスも忘れずに、、、。