Android fragments 在Kotlin中..如何从片段返回到MainActivity
在我的程序中,我有main活动和许多片段。。 我尝试使用以下代码从片段返回到MainActivityAndroid fragments 在Kotlin中..如何从片段返回到MainActivity,android-fragments,kotlin,onbackpressed,Android Fragments,Kotlin,Onbackpressed,在我的程序中,我有main活动和许多片段。。 我尝试使用以下代码从片段返回到MainActivity onBackpressed()方法 override fun onBackPressed() { if(drawer_layout.isDrawerOpen(GravityCompat.START)) { drawer_layout.closeDrawer(GravityCompat.START) } else if (fragment != null
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()
}
}
我的第一个问题是:
它可以很好地与抽屉配合使用,也可以打开主活动
但是程序还没有关闭..这些主要的
super.onBackPressed()
不工作……为什么
我的第二个问题是:
之后,如果我需要使用
getActivity().onBackpressed()
而不是旧的
就我所知,感谢大家提出您应该使用的第一个问题
val activity = activity as MainActivity
activity.onBackPressed()
因为你的片段的super不是MainActivity 活动通过
onBackPressed()
导航到活动。片段必须驻留在活动中(它们基本上是子活动),因此通过super.onBackPressed()
从片段导航到活动没有意义。您应该从一个片段导航到另一个片段,或者如果您放弃了片段,则从一个活动导航到另一个活动
要导航回上一个片段,请执行以下操作:
activity?.fragmentManager?.popBackStack()
要导航到上一个活动,请执行以下操作:
activity?.finish()
或
或者,如果您已重写onBackPressed()
方法,则从活动:
super.onBackPressed()
如果您的代码没有更多的上下文,我也不能说为什么您的最终else
语句似乎从未被调用。您的if-else
语句似乎有一个bug,因为super.onBackPressed()
将提供关闭您所处的任何活动的所需结果(MainActivity?)
我猜这与您创建另一个MainActivity实例有关。在第一回按下按钮时,您关闭抽屉。第二次创建MainActivity的另一个实例并导航到它。在第三个实例中,即使调用了super.onBackPressed()
,它也会导航回MainActivity的第一个实例,其中片段可能永远不会为null,除非您专门指定了这样的值,所以在第四个实例中,您会创建另一个MainActivity实例并导航到它。这是一个永远不会从第一个MainActivity返回的循环
建议:无论您如何显示MainActivity,都要将其转换为一个片段并进行相应的处理。另一种方法是不创建MainActivity的另一个实例,而是隐藏fragmentView并显示MainActivity视图。我不建议将片段设置为null,因为fragmentManager可能会抛出并出错,因此您还应该更改
if-else
逻辑以检查其他内容。如果您按照描述的路线走,可以说maybefragment.view.visibility==view.visibility
。最简单、最简洁的方法(Kotlin):
val activity=activity as main activity
错误:未解析的引用活动
super.onBackPressed()
else if (fragment != null) {
val intent = Intent(applicationContext, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
startActivity(intent)
}
requireActivity().addOnBackPressedCallback(viewLifecycleOwner,
OnbackPressedCallback{
startMainActivity() // Your action here...
true
}
)