7

Я работаю на операции фрагмента и backstack, как это:PopBackStack но сохранить первый фрагмент в Android

fragA => fragB => fragC => fragD 

Я хотел бы вернуться к Фрагам после обратно fromn в fragD

fragD => onBackPress => fragA 

Итак, я попытался код, как:

getChildFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 

но ясно все backstack, как я могу держать первый фрагмент в го e backsack? Большое спасибо

ответ

10

E.g. вы можете сделать следующее:

  • Добавить fragA без добавления его в backStack. Так что всегда должно быть в
    активность, и она не будет реагировать на кнопку «Назад».
  • при открытии fragD вы должны clear fragment BackStack. Поэтому, когда вы нажимаете кнопку возврата от D frag, вы возвращаетесь к A.

P.S. Существуют и другие способы, как делать то, что вы хотите. Это зависит от ...

+1

Я очищаю всю заднюю часть, а затем добавляю фрагмент fragA и fragD. благодаря – user782104

4

Поскольку «задний стек» имеет поведение, подобное стеку ... последний, первый из ... последний фрагмент, который вы добавили в задний стек, сначала выскочит из предыдущего стека , Вам нужно будет выполнить поведение, которое вам требуется вручную, указав свой собственный. Это не так сложно, используя методы класса FragmentManager.

Если вы «помечать» свои фрагменты, как вы добавить их к сделке ...

fragmentTransaction.add(new FragmentA(), "FragmentA_Tag"); 

позже можно определить, какой фрагмент, чтобы показать, при нажатии кнопки назад ...

FragmentA f = fragmentManager.findFragmentByTag("FragmentA_Tag"); 
if(f != null){ 
    f.show(); 
} 

Как вы определяете, какой фрагмент показывать, что это полностью зависит от вас. Вы можете отслеживать текущий видимый фрагмент, или вы можете использовать метод isHidden класса Fragment ... Кстати, я говорю о нативных фрагментах здесь, а не о фрагменте библиотеки.

1

Столбец содержит записи об операциях, а не фрагменты. Таким образом, вы не должны добавлять запись первой транзакции (null -> fragA) в backstack. И запись всех других транзакций должна быть добавлена ​​в заднюю часть. В этом случае вы заготовки popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); андроида удалили все фрагменты, кроме fragA, потому что нет никаких записей о том, как был добавлен fragA.

1

Всего несколько дней назад я начинаю изучать фрагменты в Android. И я столкнулся с этой проблемой. Здесь я показываю свое решение и как я это разрешаю. Пожалуйста, исправьте, если мой код неправильный. Что мы имеем в это время? Acivity, много фрагментов и их backstack. Мы хотим открыть каждый фрагмент из меню Ящика и очистить все остальные фрагменты из backstack. Но мы должны держать только один фрагмент дома. Когда мы остаемся на домашнем фрагменте, а пользователь нажимает кнопку «Назад», приложение закрывается.

Активность.Класс

protected void onCreate(Bundle savedInstanceState) 
{ 
    ... 
    // adding Home fragment without adding transaction into backstack 
    FragmentManager manager = getSupportFragmentManager(); 
    FragmentTransaction ft = manager.beginTransaction(); 
    ft.replace(R.id.container, HomeFragment.newInstance("args"), null); 
    ft.commit(); 
} 

@Override 
public void onBackPressed() { 
    if (getSupportFragmentManager().getBackStackEntryCount() == 0) { 
     finish(); 
    } 
} 

public void addFragmentFromMenu(Fragment fragment){ 
    String backStateName = fragment.getClass().getName(); 
    clearBackStack(); 
    FragmentManager manager = getSupportFragmentManager(); 
    if(manager.getBackStackEntryCount()> 0) 
    { 
     boolean fragmentPopped = manager.popBackStackImmediate(backStateName, 0); 

     if (!fragmentPopped && manager.findFragmentByTag(backStateName) == null) { 
      //fragment not in back stack, create it. 
      addFragment(fragment, manager, backStateName); 
     } 
    } 
    else // no fragments 
    { 
     addFragment(fragment, manager, backStateName); 
    } 
} 

public void addFragment(Fragment fragment, FragmentManager manager, String backStateName) 
{ 
    FragmentTransaction ft = manager.beginTransaction(); 
    ft.replace(R.id.container, fragment, backStateName); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
    ft.addToBackStack(backStateName); 
    ft.commit(); 
} 

public void clearBackStack() { 
    getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
} 

И по щелчку по пункту меню ящика

@Override 
public boolean onNavigationItemSelected(MenuItem item) { 

    int id = item.getItemId(); 

    if (id == R.id.nav_camera) { 
     addFragmentFromMenu(CameraFragment.newInstance("cam1", "cam2")); 
    } else if (id == R.id.nav_gallery) { 
     addFragmentFromMenu(TestFragment.newInstance("test1","test2")); 
    } 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawer.closeDrawer(GravityCompat.START); 
    return true; 
} 
0

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

FragmentManager fm = getActivity().getSupportFragmentManager(); 
        fm.popBackStack(Constants.TAG_HOME, FragmentManager.POP_BACK_STACK_INCLUSIVE); 

        ((MainActivity) activity).manageFragment(new HomeFragment(), Constants.TAG_HOME); 
//  write down below function in main activity    
    public void manageFragment(Fragment fragment, String tag) { 

      FragmentManager fragmentManager = getSupportFragmentManager(); 
      if (!fragmentManager.popBackStackImmediate(tag, 0)) { 

       FragmentTransaction ft = fragmentManager.beginTransaction(); 
       ft.add(R.id.content_frame, fragment, tag); 
       ft.addToBackStack(tag); 
       ft.commit(); 

      } 
     } 
Смежные вопросы