2015-07-15 2 views
1

Чтобы перемещаться между фрагментами в пределах 1 активности, я реализовал метод с именем fragmentSwicher, который получает фрагмент и заменяет его активированным фрагментом в контейнере.Как обрабатывать стоп-кадр для замены одного и того же фрагмента различными данными

До сих пор так хорошо, но теперь проблема в том, что я хочу повторно использовать фрагмент с разными данными, но мой метод fragmentSwitcher отказывается изменять фрагмент из-за существующего фрагмента в backstack.

public void fragmentSwitcher(Fragment frg) { 

    String backStateName = frg.getClass().getName(); 
    String fragmentTag = backStateName; 

    FragmentManager manager = getFragmentManager(); 

    boolean fragmentPopped = manager.popBackStackImmediate(backStateName, 0); 

    FragmentTransaction ft = manager.beginTransaction(); 

    // check if fragment, is poped from backstack and there isnt any fragment in backstack like what we want to replace 
    if (!fragmentPopped && manager.findFragmentByTag(fragmentTag) == null) { 
     ft.replace(R.id.main_container, frg, fragmentTag); 
    } 

    // with this method, we make sure that, no loading fragment come into frament backstack list, so, we are back safe. 
    if (!backStateName.equals("com.thetba.websitebuilder.fragments.ProgressFragments")) { 
     ft.addToBackStack(backStateName); 
    } 

    ft.commit(); 

} 

И это метод, который обрабатывает backstack в MainActivity:

@Override 
public void onBackPressed() { 

    if (getFragmentManager().getBackStackEntryCount() == 1) { 
     finish(); 
    // check if there is more than one fragment in backstack, show it 
    } else { 
     getFragmentManager().popBackStack(); 
    } 
} 

Я пытался частично решить эту проблему таким образом: я поставил

ft.replace(R.id.main_container, frg, fragmentTag); 

вне

if (!fragmentPopped && manager.findFragmentByTag(fragmentTag) == null) { 
     ft.replace(R.id.main_container, frg, fragmentTag); 
    } 

И fragmentSwitcher() заменяет один и тот же фрагмент с различными данными, но когда пользователь нажимает на кнопку назад, он/она будет сталкиваться с этим фрагментом:

com.thetba.websitebuilder.fragments.ProgressFragments 

, что не в backstack.

Как было сказано, что нужно делать, чтобы обрабатывать backstack при замене того же фрагмента?

ответ

0

Эта проблема возникает из-за замены того же класса фрагментов, хотя вы можете просто повторно заполнить фрагмент другими данными, но обработка BackStack в этом решении сложна.

поэтому, для этого вы можете ввести новый фрагмент с новым именем для замены. для этого вы можете добавить некоторые случайные вещи в конце строки backstackName.

пример:

if (backStateName.contains("com.thetba.websitebuilder.fragments.PagesFragment")) { 
     backStateName += String.valueOf(getRandomInt(10, 500)); 
}