基本的なことですがFragmentからFragmentに遷移する際に値を引き継ぐ実装を紹介します。
今回、紹介する方法はnewInstance
を用いた方法です。これ以外にも複数手順あるのでよかったら調べてみてください。
参考:【Android】Fragment間で値をやりとりする
フラグメント間でデータを渡す
実装完成イメージ
初期画面で入力したテキストをボタンをタップすることで、次の画面のタイトルとテキストフィールドに設定する簡単なアプリです。
遷移元画面の実装
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)
}
}
}
}