Есть ли способ поменять местами или изменить порядок записи BackStack фрагмента?…

У меня есть 5 фрагментов A, B, C, D, E. если пользователь открывает фрагмент типа A ---> B ---> C ---> D ---> E. используя задний стек по умолчанию, обратный ключ работает нормально. Но когда пользователь открывает A ---> B ---> C ---> D ---> E ---> B. После этого, если пользователь щелкнет назад, задний стек по умолчанию перейдет в A.

8
user6318834 8 Сен 2016 в 04:10

5 ответов

Лучший ответ

Используйте просмотрщик без прокрутки и в addOnPageChangeListener создайте массив и сохраните все открытые страницы. onBackPressed будет сравнивать arrayylist и отображать страницы.

0
Bincy Baby 30 Сен 2016 в 05:23

Пользователь следует по пути A ---> B ---> C ---> D ---> E, затем он хочет перейти к B. Итак, что вам следует сделать:

  • проверьте, находится ли B уже в заднем стеке или нет.
  • Если он там есть, то popBackStackImmediate, чтобы вернуться в B
  • Если его там нет, добавьте фрагмент B обычным образом.

Так что заменить фрагмент должно примерно так:

public void replaceFragment(Fragment fragment) {
    String fragmentTag =  fragment.getClass().getCanonicalName(); //unique name for the fragment, which will be used as tag.

    FragmentManager fragmentManager = getSupportFragmentManager();
    boolean isPopped = fragmentManager.popBackStackImmediate(fragmentTag, 0); // trying to return to the previous state of B if it exists.

    if (!isPopped && fragmentManager.findFragmentByTag(fragmentTag) == null){ // fragment is not in the backstack, so create it.
        FragmentTransaction ft = fragmentManager.beginTransaction();
        ft.replace(R.id.frame_layout, fragment, fragmentTag);
        ft.addToBackStack(fragmentTag);
        ft.commit();
    }
}

Помните, что это вернется к предыдущему состоянию B.

СОВЕТ: Поскольку вам не нужны два экземпляра какого-либо фрагмента, попробуйте создать их единственный экземпляр. Потому что, если вы создаете новый экземпляр фрагмента и этот фрагмент уже существует в заднем стеке, новый экземпляр будет проигнорирован (потому что вы возвращаетесь в предыдущее состояние).

1
Rohit Arya 19 Сен 2016 в 12:27

Можно вызвать addToBackstack () только тогда, когда фрагмент не добавлен раньше

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

Если да, то не вызывайте addToBackstack для этого FragmentTransaction.

Иначе вызовите addToBackstack ()

Проверьте мой пример кода:

 private void addFragment (Fragment fragment){
        boolean isFragment=false;
        String backStateName = fragment.getClass().getName();
        FragmentManager fm = getFragmentManager();

        for(int entry = 0; entry < fm.getBackStackEntryCount(); entry++){
            Log.i(TAG, "Found fragment: " + fm.getBackStackEntryAt(entry).getId());
            if(fm.getBackStackEntryAt(entry).getId().equalsIgnoreCase(FragmentB))// check if fragment is in back stack
            {
                isFragment=true;
            }
        }

        if (!isFragment){ //fragment added to back stack, create it.
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.fragmentContainer, FragmentB).addToBackStack(FragmentB).commit();
        }else {//else dont call addToBackStack()
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.fragmentContainer, FragmentB).commit();
        }
    }
0
Rissmon Suresh 22 Сен 2016 в 09:30

Просто поместите этот код в свой MainActivity

   @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            //super.onBackPressed();

            if (getFragmentManager().getBackStackEntryCount() == 1) {
                finish();
            }
            getFragmentManager().popBackStack();
        }
    }

Здесь getFragmentManager().getBackStackEntryCount() == 0 проверяет, находится ли запись в стеке на 0 или нет, если она на 0, то действие будет завершено.

В вашем случае A -> B -> C -> D -> E -> B

А будет на 0,
B будет на 1,
C на 2,
Д на 3,
E на 4,
B на 5

Поэтому, когда вы нажимаете "Назад", условие if проверяет, что счетчик backstack равен 0.

0
MashukKhan 23 Сен 2016 в 09:50

Для этого варианта использования нет api, но есть другие способы сделать это:

Примере

Фрагмент действия изменения BackStack

1
JoxTraex 8 Сен 2016 в 04:09