DevLog
Python, TypeScript, etc...
MyPage
Python, TypeScript, etc...
2022/07/21

navigationを使ったFragmentの画面遷移でActionBarの戻るボタンを使えるようにする【Android, Kotlin】

AndroidKotlin
preview
@shiromisanta
Frontend Engineer
  •  /
目次
サンプルコード

サンプルコード

遷移前の画面

class FirstFragment : Fragment() { private lateinit var viewBinding: FragmentFirstBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { viewBinding = FragmentFirstBinding.inflate(inflater, container, false) viewBinding.buttonNext.setOnClickListener { findNavController().navigate(R.id.action_firstFragment_to_secondFragment) } setUpActionBar() return viewBinding.root } private fun setUpActionBar() { val actionBar = (activity as AppCompatActivity).supportActionBar!! // 遷移前なので戻るボタン非表示 actionBar.setDisplayHomeAsUpEnabled(false) actionBar.setHomeButtonEnabled(false) } }

遷移後の画面

ActionBarのどこかを押した時のイベントはonMenuItemSelectedに入る。

戻るボタンが押された時、popBackStackするようにしている。

navigationで画面遷移している時、supportFragmentManagerではなくfindNavController()からpopBackStackを呼ばないとエラーになる。

class SecondFragment : Fragment() { private lateinit var viewBinding: FragmentSecondBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { viewBinding = FragmentSecondBinding.inflate(inflater, container, false) setUpActionBar() return viewBinding.root } private fun setUpActionBar() { val actionBar = (activity as AppCompatActivity).supportActionBar!! actionBar.show() // アクションバー戻るボタン表示 actionBar.setDisplayHomeAsUpEnabled(true) actionBar.setHomeButtonEnabled(true) actionBar.setDisplayShowTitleEnabled(false) val menuHost: MenuHost = requireActivity() menuHost.addMenuProvider(object : MenuProvider { override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { menuInflater.inflate(R.menu.menu, menu) } override fun onMenuItemSelected(menuItem: MenuItem): Boolean { val id = menuItem.itemId // 戻るボタンが押された時 if (id == android.R.id.home) { findNavController().popBackStack() } return true } }) } }

関連記事

preview
@shiromisanta 2022/08/18
光学カメラAndroidKotlin
preview
@shiromisanta 2022/07/20
Kotlin
preview
@shiromisanta 2022/07/15
AndroidKotlin
preview
@shiromisanta 2022/07/15
AndroidKotlin
2022/07/21

navigationを使ったFragmentの画面遷移でActionBarの戻るボタンを使えるようにする【Android, Kotlin】

AndroidKotlin

サンプルコード

遷移前の画面

class FirstFragment : Fragment() { private lateinit var viewBinding: FragmentFirstBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { viewBinding = FragmentFirstBinding.inflate(inflater, container, false) viewBinding.buttonNext.setOnClickListener { findNavController().navigate(R.id.action_firstFragment_to_secondFragment) } setUpActionBar() return viewBinding.root } private fun setUpActionBar() { val actionBar = (activity as AppCompatActivity).supportActionBar!! // 遷移前なので戻るボタン非表示 actionBar.setDisplayHomeAsUpEnabled(false) actionBar.setHomeButtonEnabled(false) } }

遷移後の画面

ActionBarのどこかを押した時のイベントはonMenuItemSelectedに入る。

戻るボタンが押された時、popBackStackするようにしている。

navigationで画面遷移している時、supportFragmentManagerではなくfindNavController()からpopBackStackを呼ばないとエラーになる。

class SecondFragment : Fragment() { private lateinit var viewBinding: FragmentSecondBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { viewBinding = FragmentSecondBinding.inflate(inflater, container, false) setUpActionBar() return viewBinding.root } private fun setUpActionBar() { val actionBar = (activity as AppCompatActivity).supportActionBar!! actionBar.show() // アクションバー戻るボタン表示 actionBar.setDisplayHomeAsUpEnabled(true) actionBar.setHomeButtonEnabled(true) actionBar.setDisplayShowTitleEnabled(false) val menuHost: MenuHost = requireActivity() menuHost.addMenuProvider(object : MenuProvider { override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { menuInflater.inflate(R.menu.menu, menu) } override fun onMenuItemSelected(menuItem: MenuItem): Boolean { val id = menuItem.itemId // 戻るボタンが押された時 if (id == android.R.id.home) { findNavController().popBackStack() } return true } }) } }

関連記事

preview
@shiromisanta
Frontend Engineer
  •  /
©︎Devlog