【发布时间】: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