【Kotlin】Fragmentでの画面遷移時に値の受け渡しを実装をする

基本的なことですがFragmentからFragmentに遷移する際に値を引き継ぐ実装を紹介します。
今回、紹介する方法は`newInstance`を用いた方法です。これ以外にも複数手順あるのでよかったら調べてみてください。
参考：[【Android】Fragment間で値をやりとりする
](https://qiita.com/m-coder/items/3a8e66d49f2830b09bf4#setfragmentresult%E3%82%92%E4%BD%BF%E3%81%86)[フラグメント間でデータを渡す](https://developer.android.com/training/basics/fragments/pass-data-between?hl=ja)


## 実装完成イメージ
初期画面で入力したテキストをボタンをタップすることで、次の画面のタイトルとテキストフィールドに設定する簡単なアプリです。

![Videotogif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484337/fb10c9fb-6eb7-1f7c-b7fc-352f7ebdb1ea.gif)

## 遷移元画面の実装

```FirstFragment.kt
package com.google.codelab.myapplication

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.google.codelab.myapplication.databinding.FragmentFirstBinding

class FirstFragment : Fragment() {
    lateinit var binding : FragmentFirstBinding

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = FragmentFirstBinding.inflate(inflater)

        requireActivity().title = "初期画面"

        binding.button.setOnClickListener {
            parentFragmentManager.beginTransaction()
                .replace(R.id.frameLayout, SecondFragment.newInstance(binding.editTextText.text.toString()))
                .addToBackStack(null)
                .commit()
        }
        return binding.root
    }
}

```

ボタンのタップで画面遷移を実装しています。
`replace()`の第二引数に次に定義するSecondFragmentでの`newInstance`を呼び出しています。

## 遷移先画面の実装

```SecondFragment.kt
package com.google.codelab.myapplication

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.google.codelab.myapplication.databinding.FragmentSecondBinding

class SecondFragment : Fragment() {
    private lateinit var binding : FragmentSecondBinding
    private val text: String
        get() = checkNotNull(arguments?.getString(TEXT))

    companion object {
        private const val TEXT = "text"
        fun newInstance(
            text: String
        ): SecondFragment {
            return SecondFragment().apply {
                arguments = Bundle().apply {
                    putString(TEXT, text)
                }
            }
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentSecondBinding.inflate(inflater)

        requireActivity().title = text

        binding.textView.text = text
        return binding.root
    }
}

```

`newInstance`はシングルトンで定義されており、引数に引継ぎたい変数の型を持っています。（今回は`String`)
これを呼び出したいフラグメントから呼ぶことでインスタンスを生成することができます。
参考：[Kotlinのcompanion objectとは](https://qiita.com/tkhs0604/items/261e94a42b7097dfd204)

今回は`text`一つのみを引き継ぎましたが以下のようにすることで複数の型の変数を引き継ぐことができます。

```kotlin
private val text: String
        get() = checkNotNull(arguments?.getString(TEXT))

private val number: Int
        get() = checkNotNull(arguments?.getInt(NUMBER))

    companion object {
        private const val TEXT = "text"
        private const val NUMBER = "number"
        fun newInstance(
            text: String,
            number: Int
        ): SecondFragment {
            return SecondFragment().apply {
                arguments = Bundle().apply {
                    putString(TEXT, text)
                    putInt(NUMBER, number)
                }
            }
        }
    }
```