ホーム
2022.7.26

kotlin フラグメントにメニューをつける

メニューアイテムのリソースファイル(ここではmenu_fragment1.xml)を作成して、
フラグメント(ここではBlankFragment.kt)内で読み込んで、
メニューアイテムが選択されたときの処理を記述します。
※フラグメントについては以前の記事を参考にしてください。
※フラグメントでビューバインディングを使用する方法については以前の記事を参考にしてください。

menu_fragment1.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item
android:id="@+id/menu1"
android:title="menu1" />
<item
android:id="@+id/menu2"
android:title="menu2" />
</menu>

BlankFragment.kt

package com.example.samplemenuonfragment

import android.os.Bundle
import android.view.*
import android.widget.Toast
import androidx.fragment.app.Fragment
import com.example.samplemenuonfragment.databinding.FragmentBlankBinding

class BlankFragment : Fragment() {
private var _binding: FragmentBlankBinding? = null
private val binding get() = _binding!!

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

setHasOptionsMenu(true) // *1
}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentBlankBinding.inflate(inflater)
return binding.root
}

override fun onDestroyView() {
super.onDestroyView()
_binding = null
}

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { // *2
inflater.inflate(R.menu.menu_fragment1, menu)
super.onCreateOptionsMenu(menu, inflater)
}

override fun onOptionsItemSelected(item: MenuItem): Boolean { // *3
return when(item.itemId){
R.id.menu1 -> {
binding.txvSample.text = "selected menu1."
true
}
R.id.menu2 -> {
binding.txvSample.text = "selected menu2."
true
}
else -> {
super.onOptionsItemSelected(item)
}
}
}
}

*1:onCreate()でメニューを持っていることを設定します。
*2:onCreateOptionsMenu()で作成したmenu_fragment1を紐づけます。
*3:onOptionsItemSelected()で選択されたメニューアイテムに対する処理を記述します。