【问题标题】:In Kotlin ..How I can return from fragment to MainActivity在 Kotlin ..我如何从片段返回到 MainActivity
【发布时间】:2018-03-06 00:12:18
【问题描述】:

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

而不是旧的..

谢谢大家

【问题讨论】:

    标签: android-fragments kotlin onbackpressed


    【解决方案1】:

    活动通过onBackPressed() 导航到活动。 Fragment 必须驻留在 Activity 中(它们基本上是子 Activity),因此通过 super.onBackPressed() 从 Fragment 导航到 Activity 是没有意义的。您应该从 Fragment 导航到 Fragment,或者如果您放弃 Fragments,则从 Activity 导航到 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 的第一个实例,其中 fragment 可能永远不会为空,除非你专门分配这样的,所以在第四你创建 MainActivity 的另一个实例并导航到它.这是一个永远不会从第一个 MainActivity 导航回来的循环。

    建议:无论您如何显示 MainActivity,请将其转换为 Fragment 并进行相应处理。另一种方法是隐藏 fragmentView 并显示 MainActivity 视图,而不是创建另一个 MainActivity 实例。我不建议将您的片段设置为 null,因为片段管理器可能会抛出错误,因此您还应该更改您的 if else 逻辑以检查其他内容。如果你走描述的路线,可以说fragment.view.visibility == View.Visible

    【讨论】:

      【解决方案2】:

      据我所知,对于您的第一个问题,您应该使用

      val activity = activity as MainActivity
      activity.onBackPressed()
      

      因为您的 Fragment 的 super 不是 MainActivity。

      【讨论】:

      • val activity = activity as MainActivity 错误:未解决的参考活动
      【解决方案3】:

      最简单最简洁的方式(Kotlin):

      requireActivity().addOnBackPressedCallback(viewLifecycleOwner,
                  OnbackPressedCallback{
                      startMainActivity() // Your action here...
                      true
                  }
              )
      

      【讨论】:

        猜你喜欢
        • 2019-02-26
        • 1970-01-01
        • 1970-01-01
        • 2017-12-22
        • 1970-01-01
        • 1970-01-01
        • 2020-03-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多