Фрагменты Android перекрываются при возврате назад - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть контейнер Fragment, который получает текущий показанный фрагмент.При нажатии кнопки «Назад» я хочу удалить самый верхний фрагмент, но когда он первый, вместо этого я хочу переместить приложение в фоновом режиме.(В противном случае мой основной фрагмент тоже будет удален.)

Так что мой (Kotlin) код выглядит так:

override fun onBackPressed() {
    ...
    when (supportFragmentManager.backStackEntryCount) {
        1    -> {
            moveTaskToBack(true)
        }
        else -> {
           super.onBackPressed()
           //supportFragmentManager.popBackStackImmediate()
        }
    }

Это прекрасно работает, за одним исключением.Когда я запускаю приложение и показываю второй фрагмент, я нажимаю кнопку «Назад» дважды (быстро).Таким образом, верхний фрагмент начинает удаляться, но сразу после этого запускается второе обратное нажатие (при этом верхний фрагмент не удаляется полностью).Приложение переходит в фоновый режим (как и предполагалось), но когда я снова выводю приложение на передний план, верхний фрагмент все еще там (иногда уже частично удален), но он больше не реагирует.Если я заменю другой фрагмент в моем контейнере, он появится позади застрявшего фрагмента.Я также попытался использовать supportFragmentManager.popBackStackImmediate (), но это также не сработало.

Поэтому у меня есть два вопроса:

  • какМогу ли я продолжить очистку позже (когда приложение снова станет видимым)

  • или, если это не решение, как я могу проверить, продолжается ли еще транзакция Fragment в FragementManager (доперевод приложения в фоновый режим нажатием второй кнопки назад)

---- Редактировать 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 голосов
/ 05 апреля 2019

Попробуйте это ....

на вашем xml с FrameLayout

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> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...