google的jetpack中有一个navigation组件,具体用法参考https://developer.android.google.cn/jetpack。
使用该组件好处自然是减少我们使用activity,甚至一个app只需要一个activity,每个页面用一个fragment。
问题:当splash、login等页面也放在navigation时,按手机的返回键这些页面只能一页页回退,因为设置了
app:defaultNavHost="true",并不能在某个页面例如splash、login按返回键时退出app。
由于设置了上面的属性,fragment中监听按键返回比较困难,我在stackoverflow找到一种方法:
@Suppress("UNCHECKED_CAST")
fun <F : Fragment> AppCompatActivity.getFragment(fragmentClass: Class<F>): F? {
val navHostFragment = this.supportFragmentManager.fragments.first() as NavHostFragment
navHostFragment.childFragmentManager.fragments.forEach {
if (fragmentClass.isAssignableFrom(it.javaClass)) {
return it as F
}
}
return null
}
扩展函数getFragment可以获得当前显示的fragment盏中的fragment对象,例如有一个login的fragment,只需在activity的onBackPressed处理退出:
override fun onBackPressed() {
//判断当前是哪个fragment
val fragment = getFragment(LoginFragment::class.java)
if (fragment != null){
finish()
}else{
super.onBackPressed()
}
}