2015-06-29 2 views
0

Перед тем как написать это, я столкнулся со многими вопросами stackoverflow. я так запутался в этом парне Backstack в фрагменте.Фрагмент Backstack, не появляющийся спереди на кнопке Back back prssed

Я добавил три фрагмента на тот же контейнер внутри Активность

Фрагмент 1:

private void addLandingFragment() { 
     landingPageFragment = LandingPageFragment.newInstance(); 
     FragmentTransaction transaction = manager.beginTransaction(); 
     transaction.add(R.id.container, landingPageFragment, LANDING_PAGE_FRAGMENT_TAG); 
     transaction.commit(); 

    } 

Фрагмент 2:

public void addIntrofragment() { 
    fragment2 = IntroFragment.newInstance(); 
    FragmentTransaction transaction = manager.beginTransaction(); 
    transaction.replace(R.id.container, fragment2, INTRO_PAGE_FRAGMENT_TAG); 
    transaction.addToBackStack(fragment2.getClass().getName()); 
    transaction.commit(); 
} 

Фрагмент 3:

public void onGetStartedClicked() { 
     fragment3= ConnectFragment.newInstance(); 
     FragmentTransaction transaction = manager.beginTransaction(); 
     transaction.replace(R.id.container, fragment3,CONNECT_PAGE_FRAGMENT_TAG); 
     transaction.commit(); 
    } 

Что теперь Я хочу, когда пользователь нажимает кнопку «назад» на фрагменте 3, он должен появиться на самом первом фрагменте, поэтому я переопределил метод onBackPressed().

@Override 
    public void onBackPressed() { 
     manager.popBackStack(fragment2.getClass().getName() ,FragmentManager.POP_BACK_STACK_INCLUSIVE); 

    } 

но ничего не происходит на экране, он сохраняет фрагмент 3.

UPDATE

Когда я навигации от

fragment1> FRAGMENT2

и нажимает кнопку на FRAGMENT2 назад, я прихожу к fragment1, но если перейти от

фрагмент1> фрагмент2 > fragment3

Я получаю счетчик стека 1 по методу onBackPressed(), но на экране устройства он все еще показывает фрагмент3. Теперь снова нажмите кнопку возврата, чтобы выйти из приложения, но фрагмент1 не появится на экране. Настолько озадачительно, почему это происходит?

Любое решение для достижения этой цели.

+0

Вы попробовали просто вызвать 'getFragmentManager(). PopBackStack()'? –

+0

@tyczj popBackStack ничего не возвращает. – pyus13

+0

@joaquin Я попробовал, но не повезло :( – pyus13

ответ

0

вызова replace() удалит предыдущий фрагмент, фрагмент 1 должен вызываться при помощи replace(), и фрагмент 2 & 3 должны быть вызваны с помощью add(), вы должны также добавить последнюю операцию резервного стека вызовов (фрагмент 3)

Как это:

Фрагмент 1:

private void addLandingFragment() { 
    landingPageFragment = LandingPageFragment.newInstance(); 
    FragmentTransaction transaction = manager.beginTransaction(); 
    transaction.replace(R.id.container, landingPageFragment, LANDING_PAGE_FRAGMENT_TAG); 
    transaction.commit(); 

} 

Фрагмент 2:

public void addIntrofragment() { 
fragment2 = IntroFragment.newInstance(); 
FragmentTransaction transaction = manager.beginTransaction(); 
transaction .hide(LandingPageFragment.this); 
transaction.add(R.id.container, fragment2, INTRO_PAGE_FRAGMENT_TAG); 
transaction.addToBackStack(fragment2.getClass().getName()); 
transaction.commit(); 

}

Фрагмент 3:

public void onGetStartedClicked() { 
    fragment3= ConnectFragment.newInstance(); 
    FragmentTransaction transaction = manager.beginTransaction(); 
    fragmentManager.popBackStackImmediate();  // to remove fragment 2  
    transaction.add(R.id.container, fragment3,CONNECT_PAGE_FRAGMENT_TAG); 
    transaction.addToBackStack(fragment3.getClass().getName()); 
    transaction.commit(); 
} 

наконец ваш onBackPressed должно быть так:

@Override 
public void onBackPressed() { 
    fragmentManager.popBackStackImmediate(); 
    fragmentTransaction.show(LandingPageFragment.this); 
} 

поэтому ваш onBackPressed всегда выскочит верхний фрагмент в стеке (Фрагмент 3), а так как фрагмент 2 уже был вставлен перед добавлением фрагмента 3, тогда onBackPressed отобразит самые первые фрагмент.

+0

Извините, но добавьте даже не покажет второй фрагмент на экране. Я пробовал это. – pyus13

+0

у вас есть попробовал это, прежде чем публиковать ответ? – pyus13

+0

мой плохой! Я забыл использовать show() и hide(), сейчас отредактирую свой ответ, и да, я пробовал его. –

0

Спасибо Silvia.H за поддержку. Я решил свою проблему и нашел ее лучшим решением для меня.

Единственная ошибка, которую я сделал, я не добавлял fragment3 в backstack

Так единственные изменения, которые необходимо было

public void onGetStartedClicked() { 
     fragment3= ConnectFragment.newInstance(); 
     FragmentTransaction transaction = manager.beginTransaction(); 
     transaction.replace(R.id.container, fragment3,CONNECT_PAGE_FRAGMENT_TAG); 
     transaction.addToBackStack(ConnectFragment.class.getName()); 
     transaction.commit(); 
    } 

Теперь это заставляет вас ясно, что для того, чтобы использовать popBackStack с именем, как

manager.popBackStack(fragment2.getClass().getName() ,FragmentManager.POP_BACK_STACK_INCLUSIVE); 

Вы должны сохранить эту транзакцию в задней части от того места, где вы на самом деле нажимаете кнопку «Назад».

Я сделал еще одно небольшое изменение в методе onBackPressed(), которое позволяет приложению появляться, когда пользователь нажимает кнопку «назад» на фрагменте1.

Мой onBackPressed() взгляд, как это сейчас

@Override 
    public void onBackPressed() { 

     if(manager.getBackStackEntryCount() > 0) { 
      getSupportFragmentManager().popBackStack(
        scoreTrackerIntroFragment.getClass().getName(), 
        FragmentManager.POP_BACK_STACK_INCLUSIVE); 
     }else { 

      super.onBackPressed(); 
     } 

    } 

Woop! Теперь я понимаю об этом «Backstack» парень.