2014-09-19 3 views
14

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

У меня есть один фрагмент активность:

Step1: Я прилагаю один фрагмент в OnCreate этой деятельности в Стартовом имени Фрагмент А, как:

Это OnCreate фрагмента активность

@Override 
    protected void onCreate(Bundle savedBundleState) { 
     super.onCreate(savedBundleState); 
     setContentView(R.layout.activity_base_new); 

     Fragement_Home home = new Fragement_Home(); 
     FragmentManager manager = getSupportFragmentManager(); 
     manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit(); 
    } 

Шаг: 2 После этого я прикрепленным заменил фрагмент со следующим кодом:

Fragment_More moreFragment = new Fragment_More(); 
      FragmentManager manager = getSupportFragmentManager(); 
      manager.beginTransaction().replace(R.id.frameContent, moreFragment).addToBackStack("more").commit(); 

Шаг 3: После этого снова я добавил еще один фрагмент на Fragment_More таким же образом:

Fragment_AboutRockstand termsConditions = new Fragment_AboutRockstand(); 
      getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.frameContent, termsConditions).addToBackStack("about_rockstand").commit(); 

и вот мой осколком активность onBackPressedButton Lisetener:

@Override 
public void onBackPressed() { 
    FragmentManager fm = getSupportFragmentManager(); 
    Fragment f = fm.findFragmentById(R.id.frameContent); 

if(fm.getBackStackEntryCount() > 1){ 
     fm.popBackStack(); 
    } else{ 
     finish(); 
    } 
} 

Вот проблема который я получаю:

Когда я возвращаюсь с шага 3, он дает мне предыдущий фрагмент успешно, как описано на BackPressed, он будет popbackstack и перенесет меня в предыдущий фрагмент. Но из Fragment_More, когда я снова нажимаю, он показывает мне чистый контент FRAGMENT. Он никогда не показывает первый фрагмент, который я добавил на шаге 1 в OnCreate Activity.

Прокомментируйте, пожалуйста. Что я делаю неправильно?

Благодаря

+0

Можете ли вы предоставить нам классы фрагментов для фрагментов, которые вы используете? – 2014-09-22 13:56:29

+0

На самом деле я не вижу ничего плохого, на самом деле я воспроизвел то, что вы описали (насколько это возможно), и он отлично работает. Я предполагаю, что что-то есть в коде, который вы не показываете. Я замечаю, что вы изменяете фрагмент в активности из другого фрагмента, что может привести к неприятностям (вы можете подумать об использовании слушателя из вашей деятельности). –

+0

проверить это http://stackoverflow.com/questions/32132623/onback-pressed-data-not-showing-in-fragments –

ответ

38

Вы не должны добавить первый фрагмент в backstack, как нажатие клавиши возврата будет только повернуть вспять действие, которое вы сделали. Поэтому, если вы замените фрагмент и вы нажмете назад, он изменит вашу замену. Но если вы снова нажмете на «.add()» фрагментатор, он просто удалит его и покажет вам пустую страницу. Поэтому я думаю, что удаление первого фрагмента из задней стопки должно сделать трюк. Попробуйте и дайте мне знать!

@Override 
    protected void onCreate(Bundle savedBundleState) { 
     super.onCreate(savedBundleState); 
     setContentView(R.layout.activity_base_new); 

     Fragement_Home home = new Fragement_Home(); 
     FragmentManager manager = getSupportFragmentManager(); 
     manager.beginTransaction().add(R.id.frameContent, home).commit(); 
    } 

Пример:

Так скажем, у вас есть два фрагмента, называемые & B

Если вы .add() фрагмент на страницу, и "addToBackStack()" (= сохранить обратное действие), вы сохранили фрагмент REMOVE A как действие при нажатии на спину.

Если вы .replace() фрагмент фрагментом B, а также «addToBackStack()» вы сохранили удалить B и добавить как действие при нажатии кнопки на спине.

Итак, вы понимаете, почему это не очень хорошая практика, чтобы добавить ваш первый фрагмент-переход в заднюю часть? Это просто приведет к удалению фрагмента A путем нажатия назад, что приведет к пустой странице. Надеюсь, этого достаточно.

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

0

вы используете этот manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();

попробовать использовать это вместо manager.beginTransaction().replace(R.id.frameContent, home).addToBackStack("home").commit();

Позвольте мне знать, если он работает для и

+0

№ Это мне не помогло –

+0

Не могли бы вы попробовать мой ответ @GauravArora? – Chris

+0

Да, я попробовал, тогда только я ответил вам –

2

Ваша линия:

if(fm.getBackStackEntryCount() > 1){ 

должно быть:

if (fm.getBackStackEntryCount() > 0) { 

Вы кладете 3 фрагмента на заднюю часть. После того, как вы вытащите первые две записи, количество записей в backstack тогда равно 1. Таким образом, вы не сможете извлечь первый фрагмент, добавленный в стопку.

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