在我的程序中我有MainActivity和许多片段..
我尝试使用以下代码从片段返回到MainActivity
onBackpressed()
方法
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()
而不是旧的..
全部谢谢
答案 0 :(得分:1)
活动通过onBackPressed()
导航至活动。片段必须驻留在Activity中(它们基本上是子活动),因此通过super.onBackPressed()
从片段导航到Activity是没有意义的。您应该从Fragment导航到Fragment,或者如果您放弃Fragments,然后是Activity to Activity。
导航回上一个片段:
activity?.fragmentManager?.popBackStack()
导航到上一个活动:
activity?.finish()
或
onBackPressed()
或者,如果您覆盖onBackPressed()
方法,则从活动开始:
super.onBackPressed()
如果没有更多的代码上下文,我也不能说为什么看起来你的最终else
语句从未被调用过。您的if else
语句似乎有错误,因为super.onBackPressed()
会提供关闭您所处活动的所需结果(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的第一个实例,其中片段可能永远不会为null,除非你专门指定这样,所以在第四个你创建另一个MainActivity实例并导航它。这是一个永远不会从第一个MainActivity导航回来的循环。
建议:但是,您正在显示MainActivity,将其转换为Fragment并相应地处理它。另一种方法是创建另一个MainActivity实例,而不是隐藏fragmentView并显示MainActivity视图。我不建议将片段设置为null,因为fragmentManager可能会抛出并出错,因此您还应该更改if else
逻辑以检查其他内容。如果你走的是路线,可以说fragment.view.visibility == View.Visible
。
答案 1 :(得分:1)
最简单,最简洁的方法(科特琳):
requireActivity().addOnBackPressedCallback(viewLifecycleOwner,
OnbackPressedCallback{
startMainActivity() // Your action here...
true
}
)
答案 2 :(得分:0)
就我的第一个问题而言,我应该理解你应该使用
val activity = activity as MainActivity
activity.onBackPressed()
因为您的片段的超级不是MainActivity。