2
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-05-30

基本的なことですがFragmentからFragmentに遷移する際に値を引き継ぐ実装を紹介します。
今回、紹介する方法はnewInstanceを用いた方法です。これ以外にも複数手順あるのでよかったら調べてみてください。
参考:【Android】Fragment間で値をやりとりする
フラグメント間でデータを渡す

実装完成イメージ

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

Videotogif (1).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とは

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

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)
                }
            }
        }
    }
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2