Вопрос по android – Программно вернуться к предыдущему фрагменту в backstack

192

Скажем, у меня есть действие, в котором фрагменты добавлены программно:

private void animateToFragment(Fragment newFragment, String tag) {
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, tag);
    ft.addToBackStack(null);
    ft.commit();
}

Каков наилучший способ вернуться к предыдущему фрагменту, который был виден?

я нашелТриггер назад функциональность кнопки при нажатии кнопки в Android но я думаю, что имитация события back key не является правильным способом (и я не могу заставить его работать):

dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));

призваниеfinish() просто закрывает действие, которое меня не интересует.

Есть ли лучший способ сделать это?

Ваш Ответ

8   ответов
116

Чтобы уточнить другие предоставленные ответы, это мое решение (помещено в упражнение):

@Override
public void onBackPressed(){
    FragmentManager fm = getFragmentManager();
    if (fm.getBackStackEntryCount() > 0) {
        Log.i("MainActivity", "popping backstack");
        fm.popBackStack();
    } else {
        Log.i("MainActivity", "nothing on backstack, calling super");
        super.onBackPressed();  
    }
}
Error: User Rate Limit Exceeded"When there are FragmentTransaction objects on the back stack and the user presses the Back button, the FragmentManager pops the most recent transaction off the back stack and performs the reverse action (such as removing a fragment if the transaction added it)." (Source)
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededfm.getBackStackEntryCount() > 1Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededdeveloper.android.com/training/basics/fragments/index.htmlError: User Rate Limit Exceeded
7

Add those line to your onBackPressed() Method. popBackStackImmediate() method will get you back to the previous fragment if you have any fragment on back stack `

if(getFragmentManager().getBackStackEntryCount() > 0){
     getFragmentManager().popBackStackImmediate();
}
else{
    sup,er.onBackPressed();
}

`

1

Программно вернитесь к предыдущему фрагменту, используя следующий код.

if ( getFragmentManager().getBackStackEntryCount() > 0) 
{
          getFragmentManager().popBackStack();
          return;
}
super.onBackPressed();
4

Это решение отлично работает для навигации по фрагментам в нижней строке, когда вы хотите закрыть приложение, когда в основном фрагменте нажата кнопка.

С другой стороны, когда вы открываете вторичный фрагмент (фрагмент во фрагменте), который определен как «подробная пицца» в моем коде он вернет предыдущее состояние первичного фрагмента. Ура!

Внутри деятельности на спине нажми поставь вот это:

Fragment home = getSupportFragmentManager().findFragmentByTag("DetailedPizza");

    if (home instanceof FragmentDetailedPizza && home.isVisible()) {
        if (getFragmentManager().getBackStackEntryCount() != 0) {
            getFragmentManager().popBackStack();
        } else {
            super.onBackPressed();
        }

    } else {
        //Primary fragment
        moveTaskToBack(true);
    }

И запустите другой фрагмент так:

Fragment someFragment = new FragmentDetailedPizza();
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.container_body, someFragment, "DetailedPizza");
    transaction.addToBackStack("DetailedPizza");
    transaction.commit();
0

Добавляяfragment_tran.addToBackStack(null) на последнем фрагменте я могу вернуться на последний фрагмент.

adding new fragment:

view.findViewById(R.id.changepass).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.container, new ChangePassword());
            transaction.addToBackStack(null);
            transaction.commit();
        }
    });
1

Чтобы этот фрагмент появился снова, просто добавьте этот фрагмент в backstack, который вы хотите вернуть обратно нажатием, например:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Fragment fragment = new LoginFragment();
        //replacing the fragment
        if (fragment != null) {
            FragmentTransaction ft = ((FragmentActivity)getContext()).getSupportFragmentManager().beginTransaction();
            ft.replace(R.id.content_frame, fragment);
            ft.addToBackStack("SignupFragment");
            ft.commit();
        }
    }
});

В приведенном выше случае я открываюLoginFragment когдаButton button нажата, сейчас пользователь находится вSignupFragment, Так что еслиaddToBackStack(TAG) называется, гдеTAG = "SignupFragment", то когда кнопка назад нажата вLoginFragmentмы возвращаемся кSignUpFragment.

Удачного кодирования!

Error: User Rate Limit Exceeded
312

Посмотрите наgetFragmentManager().popBackStack() методы (есть несколько на выбор)

http://developer.android.com/reference/android/app/FragmentManager.html#popBackStack ()

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
getFragmentManager().popBackStackImmediate(); сделал свое дело. Благодарю. Aske B.
@alicanbatur да, вам нужно использовать addTOBackStack ().
24

Когда мы обновляем / добавляем фрагменты,

Следует включить.addToBackStack().

getSupportFragmentManager().beginTransaction()
    .add(detailFragment, "detail") // Add this transaction to the back stack (name is an optional name for this back stack state, or null).
    .addToBackStack(null)
    .commit();

После этого, если мы дадимgetFragments.popBackStackImmediate() вернет true, если мы добавим / обновим фрагменты и вернемся к текущему экрану.

Похожие вопросы