Кнопка «Назад» не работает при добавлении фрагмента в стопку

Я пытался понять это.

Я начну с того, что существует много решений StackOverflow, но большинство из них предлагают подключить onBackPressed() самостоятельно, что действительно работает, но я не понимаю, почему я не получаю такое поведение бесплатно с помощью .addToBackStack

Не могу найти ничего подходящего в документации, кроме того, что это должно было сработать.

Я использую самую простую форму, чтобы добавить фрагмент в стопку.

getActivity().getSupportFragmentManager().beginTransaction().add(R.id.create_fragment_holder2, new MyFragment(), TAG).addToBackStack(TAG).commit();

getActivity — это FragmentActivity. Идет вместе с этим FrameLayout:

 <FrameLayout
        android:id="@+id/create_card_fragment_holder2"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

И простой фрагмент с TextView с синим фоном

public class MyFragment extends Fragment{

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
        @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.my_layout, container, false);
}}

Проблема в том, что если я не попрошу .addToBackStack, то кнопка «Назад» закроет содержащий фрагмент, а если я это сделаю, кнопка «Назад» не будет реагировать, и я навсегда увижу этот синий экран.

Каждое решение StackOverflow, которое я нашел, говорит о том, что нужно подключить onBackPressed() самостоятельно, что действительно работает, но я не понимаю, почему я не получаю это поведение бесплатно с помощью .addToBackStack. Не могу найти ничего подходящего в документации, кроме того, что это должно было сработать.

ОБНОВЛЕНИЕ: я обнаружил, что это не работает, потому что я блокировал его в onBackPress в действии. Так что без него он будет работать как положено. Тем не менее, это хорошее место для ввода проверки и предотвращения ее работы, если это вам нужно :)


person Alon    schedule 16.05.2017    source источник
comment
Вы говорите об аппаратной кнопке «Назад» или о кнопке «Вверх» на панели действий?   -  person Daniel Nugent    schedule 16.05.2017
comment
Аппаратное обеспечение   -  person Alon    schedule 16.05.2017
comment
Я сделал. Это не изменило поведение (это означает, что кнопка «Назад» по-прежнему не отвечает, если я добавлю в стопку)   -  person Alon    schedule 16.05.2017
comment
Есть ли у вас какие-либо другие фрагменты, работающие в настоящее время, или это единственный?   -  person WoogieNoogie    schedule 16.05.2017
comment
Как и в вопросе @WoogieNoogie, вы уверены, что добавили этот MyFragment только один раз?   -  person petey    schedule 16.05.2017
comment
Он работает внутри другого фрагмента. И добавляется только при нажатии кнопки, так что да, это только один раз.   -  person Alon    schedule 17.05.2017


Ответы (2)


Переопределите onBackPressed() в свою активность и вызовите это, чтобы удалить текущий фрагмент из стека, так как вы его добавили.

if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
    getSupportFragmentManager().popBackStackImmediate()
} else {
    finish();
}

Это будет работать только тогда, когда вы добавите фрагмент в стопку с помощью метода addToBackStack().

Когда вы добавляете фрагмент в backstack, чтобы отслеживать обратный поток и все предыдущие изменения, этот экземпляр будет сохранен в FragmentManager. Если вы хотите вернуться к предыдущему фрагменту, просто извлеките последний фрагмент из стопки. Если вы не добавите его в стек, вы не сможете откатить пройденный путь и все предыдущие операции.

person Florescu Cătălin    schedule 16.05.2017

Похоже, вы знаете, как обойти проблему, с которой вы столкнулись, и ваш пост, кажется, задает один конкретный вопрос, поэтому я отвечу на него:

Я не понимаю, почему я не получаю такое поведение бесплатно с .addToBackStack

Оно делает! Но только до определенного момента. Кнопка "Назад" будет автоматически перемещаться назад по стеку, но не будет закрывать последний фрагмент, если возвращаться не к чему. Таким образом, если вы добавите еще один фрагмент в задний стек (и не переопределите кнопку «Назад»), он автоматически вернет пользователя к вашему первому фрагменту, но после этого ничего не сделает.

person WoogieNoogie    schedule 16.05.2017