在我的程序中,我有MainActivity和许多片段。
我尝试以下代码从片段返回到MainActivityonBackpressed()
方法
override fun onBackPressed() {
if(drawer_layout.isDrawerOpen(GravityCompat.START)) {
drawer_layout.closeDrawer(GravityCompat.START)
}
else if (fragment != null) {
val intent = Intent(applicationContext, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
startActivity(intent)
}
else {
super.onBackPressed()
}
}
我的第一个问题是:
它与Drawer配合良好,还可以打开MainActivity
但是程序没有关闭..这些主要
super.onBackPressed()
不工作..为什么
我的第二个问题是:
否则如果我需要使用
getActivity().onBackpressed()
而不是旧的..
谢谢大家
最佳答案
Activity 通过onBackPressed()
导航到“ Activity ”。片段必须驻留在 Activity 中(它们基本上是子 Activity ),因此通过super.onBackPressed()
从片段导航到 Activity 是没有意义的。您应该从“片段”导航到“片段”,或者如果您放弃“片段”,则从“ Activity ”转向“ Activity ”。
要导航回上一个片段:
activity?.fragmentManager?.popBackStack()
导航到上一个 Activity :
activity?.finish()
要么
onBackPressed()
或者,如果您已覆盖
onBackPressed()
方法,则从 Activity 中:super.onBackPressed()
如果没有更多代码上下文,我也无法说出为什么最终的
else
语句从未被调用过。您的if else
语句似乎有一个错误,因为super.onBackPressed()
将提供所需的结果,以关闭您正在进行的任何 Activity (MainActivity?)。else if (fragment != null) {
val intent = Intent(applicationContext, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
startActivity(intent)
}
我的猜测是它与您创建MainActivity的另一个实例有关。第一次按下时,您合上了抽屉。在第二个上,您创建另一个MainActivity实例并导航到它。在第三个实例上,即使
super.onBackPressed()
被调用,它也将导航回到MainActivity的第一个实例,除非您专门分配了片段,否则fragment永远不会为null,因此在第四个实例上,您将创建另一个MainActivity实例并导航至该实例。这是一个永远不会从第一个MainActivity返回的循环。建议:但是,您正在显示MainActivity,请将其转换为Fragment并进行相应处理。另一种方法是代替创建MainActivity的另一个实例,隐藏fragmentView并显示MainActivity View 。我不建议将您的fragment设置为null,因为fragmentManager可能会抛出错误,因此,您还应该更改
if else
逻辑以检查其他内容。如果您选择的路线,请说fragment.view.visibility == View.Visible
。
关于android-fragments - 在Kotlin中..我如何从片段返回MainActivity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49121493/