2015-02-17 2 views
0

Я пытаюсь сделать правильный BackStack. Я попытался реализовать this decision. Но это не работает для меня.Android Correct Fragment BackStack

У меня есть один список в навигационном ящике и другой навигации. Поэтому, когда я несколько раз выбираю несколько списков фрагментов, я хочу, чтобы одно нажатие возвращалось в главное меню, а не возвращалось к BackStack. enter image description here

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


@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putInt("theme", mThemeId); 
} 
private void replaceFragment (Fragment fragment){ 
    String backStateName = fragment.getClass().getName(); 
    String fragmentTag = backStateName; 

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

    if (!fragmentPopped && manager.findFragmentByTag(fragmentTag) == null) { 
     FragmentTransaction ft = manager.beginTransaction(); 
     ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right, 
       R.anim.slide_back_in_left, R.anim.slide_back_out_right); 
     ft.replace(R.id.frgmCont, fragment); 
     ft.addToBackStack(backStateName); 
     ft.commit(); 
    } 


} 
+0

набор 'ft.addToBackStack (нуль)' для каждого фрагмента – Xcihnegn

ответ

0

Вы можете начать путем определения этих двух методов:

метод, чтобы подтолкнуть транзакцию фрагмент с флагом, который определяет, если фрагмент должен быть добавлен к backStack или нет:

private void pushToStack(Fragment fragment, String tag, int transition, boolean addToBackStack){ 
    FragmentManager fm = this.getSupportFragmentManager(); 

    FragmentTransaction transaction = fm.beginTransaction(); 
    transaction.replace(R.id.container, fragment, tag); 

    if(transition > 0){ 
     transaction.setTransition(transition); 
    } 
    if(addToBackStack){ 
     transaction.addToBackStack(tag); 
    } 

    transaction.commit(); 
} 

метод, который очищает вне backStack:

public void clearStack(){ 
    FragmentManager fm = this.getSupportFragmentManager(); 
    fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
} 

Тогда вам только нужно обрабатывать следующие 3 случая:

1) Когда деятельность вновь созданного не добавит фрагмент в backstack:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.setContentView(R.layout.activity_home); 
    this.pushToStack(DefaultHomeFragment.newInstance(), DefaultHomeFragment.class.getSimpleName(), -1, false); 
} 

2) Если вы хотите добавить новый фрагмент для навигации потока вы называете pushToStack метод с addToBackStack набором для true:

this.pushToStack(NavigationSecondFragment.newInstance(), NavigationSecondFragment.class.getSimpleName(), DEFAULT_TRANSITION, true); 
this.pushToStack(NavigationSecondFragment.newInstance(), NavigationThirdFragment.class.getSimpleName(), DEFAULT_TRANSITION, true); 

3) Если разыскиваемый фрагмент для толкания является DefaultHomeFragment, очистить стек, а затем добавить его в первый раз с чем-то вроде этого:

private static final String DEFAULT_CONTENT_NAME = DefaultHomeFragment.class.getSimpleName(); 

public addFragmentToNavigation(Fragment newFragment){ 
    boolean addToBackStack = true; 

    if(newFragment..getClass().getSimpleName().equals(DEFAULT_CONTENT_NAME)){ 
     addToBackStack = false; 
     this.clearStack(); 
    } 

    this.pushToStack(newFragment, newFragment.getClass().getSimpleName(), 
     DEFAULT_TRANSITION, addToBackStack); 
} 

Этот код может дать вам лучшее представление: https://github.com/GrzegorzFeather/open-mbsurfer

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