Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android fragments 在Kotlin中..如何从片段返回到MainActivity_Android Fragments_Kotlin_Onbackpressed - Fatal编程技术网

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

Android 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

在我的程序中,我有main活动和许多片段。。 我尝试使用以下代码从片段返回到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()
    }
}
我的第一个问题是:

它可以很好地与抽屉配合使用,也可以打开主活动 但是程序还没有关闭..这些主要的

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
逻辑以检查其他内容。如果您按照描述的路线走,可以说maybe
fragment.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
            }
        )