Как я могу удалить свой Activity setContentView из Back Stack?

На Stackoverflow есть сотни вопросов по этому поводу, но ни один из них не касается моей конкретной проблемы.

Я начинаю свою активность с этого кода как статическую функцию в моем классе активности:

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, который является полноэкранным и является заполнителем/рамкой для фрагментов, которые я хочу загрузить. Моя активность очень проста, как мастер с 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 и нажимает кнопку «Назад», я бы хотел, чтобы действие просто завершилось. Я пробовал кучу разных вещей, чтобы избавиться от этой транзакции setContentView(R.layout.activity) в моем заднем стеке, и ничего не сработало. Я предполагаю, что для этого есть простое решение, например, установка ФЛАГА, но оно ускользнуло от меня. В прошлом я переопределял метод OnBackPress и предполагаю, что это сработает, но мне все еще любопытно, есть ли более простой способ вытолкнуть этот первый элемент (Activity) из моего заднего стека, не требуя от меня переопределения OnBackPressed.

Что мне не хватает?


person szaske    schedule 06.05.2020    source источник


Ответы (1)


Я думаю, вам не нужно добавлять в задний стек фрагмент A. Когда во фрагменте A пользователь снова нажмет, действие будет завершено!

person Công Hải    schedule 06.05.2020
comment
Спасибо, ваше предложение сработало! Я думаю, что для меня проблема в том, что я продолжаю думать о заднем стеке как о стеке фрагментов или действий, хотя я считаю, что это стек транзакций от одного к другому. Это затрудняет понимание. - person szaske; 06.05.2020
comment
@szaske уверен, что ему нравится Activity Stack, каждый раз, когда вы нажимаете «Назад», Host Activity проверяет любой его фрагмент в BackStack и будет финским (), когда задний стек пуст. - person Công Hải; 06.05.2020