はじめに
こんにちは、エンジニアのkeitaMaxです。
今回は前回作成したFragmentをもう一つ作成して、Fragment間の遷移(切り替え)をやろうと思います。
前回の記事
実装方法
MainActivityにフラグメントを切り替える関数を作成し、それを各フラグメントから呼んで、画面遷移(切り替え)をおこなようと思います。
Fragment作成
Fragmentをもう一つ作成しました。名前をExampleTwoFragment
としました。
class ExampleTwoFragment : Fragment() {
private var _binding: FragmentExampleTwoBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentExampleTwoBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
}
override fun onResume() {
super.onResume()
}
override fun onPause() {
super.onPause()
}
override fun onDestroy() {
super.onDestroy()
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"
tools:context=".ExampleTwoFragment">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textColor="@color/white"
android:text="フラグメント2" />
</FrameLayout>
Fragmentの置き換え処理の作成
MainActivityにreplaceFragment
という関数を用意しました。
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
if (savedInstanceState == null) {
supportFragmentManager.commit {
setReorderingAllowed(true)
add(binding.fragmentContainerView.id, ExampleFragment())
}
}
}
public fun replaceFragment(fragment: Fragment) {
supportFragmentManager.commit {
setReorderingAllowed(true)
replace(binding.fragmentContainerView.id,fragment)
}
}
}
replaceFragmentの引数に次に表示したいフラグメントをいれて呼び出すように作成しました。
Fragment側の修正
ExampleFragment
からボタンが押された時にreplaceFragment
を呼び出すような処理を書いていきます。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
activity = context as? MainActivity
binding.button.setOnClickListener{
activity?.replaceFragment(ExampleTwoFragment())
}
}
onViewCreated
を上のように修正しました。
実際に遷移するか試す
実際に起動して確かめてみます。
初期画面は以下になります。
![スクリーンショット 2024-07-23 16.31.08.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3715123%2Fc3ade01d-11b9-dc99-f4b9-295721750882.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=63e022556c02d38f1185e304cf154d9f)
ここから、下のフラグメント2へ
とかかれているボタンを押します。
![スクリーンショット 2024-07-23 16.31.13.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3715123%2Fe9ca16e2-3cbe-0376-3b82-7897d5b9bb5b.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=c6df58f7b811876c189b73eb8138392a)
すると上のように遷移することができました。
おまけ バックボタンについて
このままだと、フラグメント2の状態でバックボタンを押すとアプリが終了してしまいます。
これをバックボタンを押した時に一つ目の画面に戻れるようにするには、以下のようにaddToBackStack
を追加する必要があります。
public fun replaceFragment(fragment: Fragment) {
supportFragmentManager.commit {
setReorderingAllowed(true)
replace(binding.fragmentContainerView.id, fragment)
addToBackStack("name") // 追加
}
}
これをすると、ボックボタンを押したら一つ前に表示されていたフラグメントの画面を表示することができます。
おわりに
この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。
最後まで読んでいただきありがとうございました!
参考