【问题标题】:How can I remove my Activity setContentView from the Back Stack?如何从 Back Stack 中删除我的 Activity setContentView?
【发布时间】:2020-05-06 09:02:31
【问题描述】:

Stackoverflow 上有一百个与此相关的问题,但没有一个与我的具体问题有关。

我正在使用此代码作为我的 Activity 类中的静态函数来启动我的 Activity:

fun startForResult(activity: Activity, code: Int) {
    val intent = Intent(activity, MyActivity::class.java)
    activity.startActivityForResult(intent, code)
    activity.overridePendingTransition(R.anim.none, R.anim.none)
}

当 MyActivity 启动时,运行 onCreate 和其中的 setContentView(R.layout.activity)。这似乎在 Back Stack 上。 Activity 只有一个 FrameLayout,它是全屏的,是我要加载的片段的占位符/框架。我的 Activity 非常简单,就像一个有 3 个片段/屏幕的向导,全屏。一旦我的活动 OnCreate 完成,我的演示者使用如下代码加载第一个片段 FragmentA:

supportFragmentManager
    .beginTransaction()
    .replace(R.id.myContentFrame, FragmentA.newInstance())
    .addToBackStack(null)
    .commit()

这也放在后面的堆栈上。用户按下下一步按钮,我的演示者运行以下代码:

supportFragmentManager
    .beginTransaction()
    .replace(R.id.myContentFrame, FragmentB.newInstance())
    .addToBackStack(null)
    .commit()

当用户按下 FragmentB 上的后退按钮时,会将用户带回 FragmentA,这很好。我的问题发生在他们按下 FragmentA 上的后退按钮时,它会将他们带到一个清晰的屏幕,这显然是 setContentView(R.layout.activity) 事件,它已被添加到后堆栈中,我将返回它。所以我想让那个事件,活动的开始,以及它的不可见布局不添加到后台堆栈。当用户在 FragmentA 上并按下后退按钮时,我希望 Activity 刚刚完成。 我已经尝试了很多不同的方法来摆脱我后台堆栈中的这个setContentView(R.layout.activity) 事务,但没有任何效果。我认为有一个简单的解决方案,比如设置一个 FLAG,但它已经避开了我。在过去,我已经覆盖了 OnBackPress 方法,并且我认为这会起作用,但我仍然很好奇是否有更简单的方法可以将第一个(活动)项从我的后台堆栈中弹出,而无需我覆盖 OnBackPressed。

我错过了什么?

【问题讨论】:

    标签: android android-fragments kotlin back-stack fragment-backstack


    【解决方案1】:

    我认为您无需将片段 A 添加到后台堆栈。当在片段 A 中时,用户后按 Activity 将完成!

    【讨论】:

    • 谢谢您,您的建议奏效了!我认为对我而言,问题是我一直将后台堆栈视为一堆片段或活动,而我认为它是一堆从一个到另一个的事务。这让人很难理解。
    • @szaske 确定它喜欢 Activity Stack,任何时候你按下 Host Activity 都会检查它的 BackStack 中的任何片段,并且当返回堆栈为空时将是 Finnish()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2011-05-19
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多