在Kotlin ..如何从片段返回到MainActivity

时间:2018-03-06 00:12:19

标签: android-fragments kotlin onbackpressed

在我的程序中我有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()

而不是旧的..

全部谢谢

3 个答案:

答案 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。