2012-12-04 15 views
15

Czy obsługa wstecznego stosu wspiera interakcję z zagnieżdżonymi fragmentami w systemie Android?Zagnieżdżone fragmenty i tylny stos

Jeśli tak, to co robię źle? W mojej implementacji przycisk wstecz całkowicie ignoruje fakt, że dodałem tę transakcję do tylnego stosu. Mam nadzieję, że nie jest to spowodowane problemem z zagnieżdżonymi fragmentami i po prostu robię coś niepoprawnie.

Poniższy kod znajduje się wewnątrz jednego z moich kawałków i jest wykorzystywany do wymiany nowy fragment z cokolwiek zagnieżdżona fragment jest aktualnie pokazane:

 MyFragment fragment = new MyFragment(); 
    FragmentTransaction ft = getChildFragmentManager().beginTransaction(); 
    ft.setCustomAnimations(R.animator.slide_in_from_right, R.animator.slide_out_left, R.animator.slide_in_from_left, R.animator.slide_out_right); 
    ft.addToBackStack(null); 
    ft.replace(R.id.myFragmentHolder, fragment); 
    ft.commit(); 
+0

Każdy widząc ten OP mogą przyjmować spójrz na inny, http://stackoverflow.com/questions/13418436/android-4-2-back-stack-behaviour-with-nested-fragments, co wyjaśnia lepiej. – lcn

Odpowiedz

28

Mam ten sam problem, chciałbym fragmenty gniazdo, i zachować stos z powrotem dla każdego zagnieżdżonego fragmentu.

Ale ... wygląda na to, że ten przypadek nie jest obsługiwany przez bibliotekę wsparcia v4. W kodzie FragmentActivity w bibliotece, można znaleźć:

public void onBackPressed() { 
    if (!mFragments.popBackStackImmediate()) { 
     finish(); 
    } 
} 

W mFragments reprezentuje FragmentManager aktywności, ale nie wydaje się to menedżer „rozchodzi” pop dla dzieci menedżerów. Rozwiązaniem byłoby ręcznie wywołać popBackStackImmediate() na kierownika dziecka, tak w działalności odziedziczone FragmentActivity:

private Fragment myFragmentContainer; 

    @Override 
    public void onBackPressed() { 
      if (!myFragmentContainer.getChildFragmentManager().popBackStackImmediate()) { 
       finish(); //or call the popBackStack on the container if necessary 
      } 
    } 

Nie może być lepszy sposób, a bardziej zautomatyzowany sposób, ale dla moich potrzeb wszystko jest w porządku.

+0

Hmm, oddam to później i zaakceptuję, jeśli to zadziała. – MikeS

+0

Wydaje się, że to nie działa. Po pierwsze, Fragmenty nie mają metody popBackStackImmediate() (robią to tylko FragmentManager). Próbowałem podstawiania 'this.getFragmentManager(). PopBackStackImmediate()', ale zasadniczo nie widziałem nic innego niż to, co już się dzieje. – MikeS

+1

Po pracy z tym, co mi dałeś, znalazłem rozwiązanie! Zmienię twoją odpowiedź tak, aby zawierała rozwiązanie i oznaczyłam je jako zaakceptowane, ponieważ postawiłeś mnie na właściwą drogę ... – MikeS

-2
@Override 
public void onBackPressed() { 
    FragmentManager fm = getSupportFragmentManager(); 
    if (fm.getBackStackEntryCount() > 0) { 
     fm.popBackStack(); 
     return; 
    } 
    finish(); 
} 
+0

Proszę dodać wyjaśnienie dotyczące odpowiedzi. – DontVoteMeDown

4

W moim obecnym projekcie mamy wiele „zagnieżdżonych warstw”, więc wpadliśmy po obejście automatyczne pop backstack tylko dla najlepszych menedżerów fragmentów poziom:

@Override 
public void onBackPressed() { 
    SparseArray<FragmentManager> managers = new SparseArray<>(); 
    traverseManagers(getSupportFragmentManager(), managers, 0); 
    if (managers.size() > 0) { 
     managers.valueAt(managers.size() - 1).popBackStackImmediate(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

private void traverseManagers(FragmentManager manager, SparseArray<FragmentManager> managers, int intent) { 
    if (manager.getBackStackEntryCount() > 0) { 
     managers.put(intent, manager); 
    } 
    if (manager.getFragments() == null) { 
     return; 
    } 
    for (Fragment fragment : manager.getFragments()) { 
     if (fragment != null) traverseManagers(fragment.getChildFragmentManager(), managers, intent + 1); 
    } 
} 
Powiązane problemy