弹出时,Android片段重叠

时间:2018-11-20 10:31:38

标签: android android-fragments kotlin

我有一个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()

以下是重叠片段的外观截图:

Screenshot of the overlapping Fragments

1 个答案:

答案 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>