我有一个Fragment容器,它可以显示当前的Fragment。当按下后退按钮时,我想删除最上面的片段,但是当它是第一个片段时,我想改为在后台移动应用程序。 (否则,我的主要片段也将被删除。)
所以我的(Kotlin)代码如下:
override fun onBackPressed() {
...
when (supportFragmentManager.backStackEntryCount) {
1 -> {
moveTaskToBack(true)
}
else -> {
super.onBackPressed()
//supportFragmentManager.popBackStackImmediate()
}
}
这很好,但有一个例外。当我启动应用程序并显示第二个片段时,我两次(快速)按了后退按钮。这样,顶部片段开始被移除,但是第二次后按会立即触发(顶部片段未被完全移除)。 该应用程序进入了后台(按预期方式),但是当我再次将该应用程序置于前台时,顶部的Fragment仍然在那里(有时已被部分删除),但不再起作用。如果替换容器中的另一个片段,它会出现在卡住的片段后面。 我也尝试使用supportFragmentManager.popBackStackImmediate()代替,但是它也没有用。
所以我在这里有两个问题:
我以后如何继续清理(当应用再次变得可见时)
或如果这不是解决方案,我如何检查FragementManager中是否仍在进行Fragment事务(在第二次后退使应用程序进入后台之前)
----编辑1 ----
我注意到这仅在替换片段时设置事务动画时发生。因此,如果我在添加片段的那一刻就删除了该行(而不是在按下时),它似乎可以工作:
ft.setCustomAnimations(R.anim.enter_from_bottom, R.anim.exit_to_top,
R.anim.enter_from_top, R.anim.exit_to_bottom)
----编辑2 ----
在此处使用此代码时,它也可以工作(只是区别在于它也删除了第一个(底部)片段。但是显然,本机Android方法似乎可以避免该问题。
super.onBackPressed() // Remove bottom fragement
super.onBackPressed() // No more fragments -> move App into background
----这就是“创建”片段的方式----
val ft = supportFragmentManager.beginTransaction()
ft.setCustomAnimations(R.anim.enter_from_bottom, R.anim.exit_to_top,
R.anim.enter_from_top, R.anim.exit_to_bottom)
ft.replace(R.id.fragmentContainer, fragment, fragment::class.java.simpleName)
.addToBackStack(fragment::class.java.simpleName)
.commitAllowingStateLoss()
以下是重叠片段的外观截图:
答案 0 :(得分:0)
尝试一下。...
使用FrameLayout在您的xml上
android:background="#ffffff"
并在主视图组件中的所有片段.xml中也添加示例:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>