FragmentでBackPressedを捕る
FragmentOnBackPressed.kt
fun View.catchBackPressed(vararg listener: FragmentOnBackPressed) {
requestFocus()
setOnKeyListener { _, k, e ->
if (k == KeyEvent.KEYCODE_BACK && e.action == KeyEvent.ACTION_UP) {
listener.any { it.onBackPressed() }
} else {
false
}
}
}
interface FragmentOnBackPressed {
fun onBackPressed(): Boolean
}
AppFragment.kt
class AppFragment: Fragment(), FragmentOnBackPressed {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
view.catchBackPressed(this)
}
override fun onBackPressed(): Boolean {
return if (flag) {
some()
true
} else {
false
}
}
}
仕様
View.setOnKeyListener
の中でlistener.any { it.onBackPressed() }
としているので、true
を返すとそれ以降のonBackPressed
を呼び出しましぇん。
つまり...
MyFragment.kt
class MyFragment: Fragment(), FragmentOnBackPressed {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val viewModel = ViewModelproviders.of(this).get(MyViewModel::class.java)
view.catchBackPressed(viewModel, this)
}
override fun onBackPressed(): Boolean {
some()
return true
}
}
class MyViewModel: ViewModel(), FragmentOnBackPressed {
override fun onBackPressed(): Boolean {
someModel()
return true
}
}
とすると、MyFragment
のonBackPressed
は絶対に呼ばれないですね!