2012-12-04 4 views
15

백 스택은 안드로이드에서 중첩 된 조각과의 상호 작용을 지원합니까?중첩 된 조각 및 백 스택

만약 그렇다면 무엇이 잘못 되었나요? 구현시 뒤로 버튼은이 트랜잭션을 백 스택에 추가한다는 사실을 완전히 무시하고 있습니다. 나는 그것이 중첩 된 조각들에 대한 문제 때문에 그리고 내가 잘못한 것을하고 있기 때문에 그런 것이 아니라고 기대하고있다. 나는에 둥지 조각을 싶습니다

 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

누구나 걸릴 수 있습니다 또 다른 하나는 http://stackoverflow.com/questions/13418436/android-4-2-back-stack-behaviour-with-nested-fragments를 참조하십시오. – lcn

답변

28

내가 같은 문제가 있습니다 :

다음 코드는 내 조각 중 하나의 내부에 중첩 된 어떤 조각하는 것은 현재 표시되고있는 새로운 조각을 교환하는 데 사용됩니다 중첩 된 각 조각에 대해 백 스택을 유지할 수 있습니다.

하지만이 케이스는 v4 지원 라이브러리에서 처리하지 않는 것 같습니다.

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

mFragments이 활동의 ​​FragmentManager 표현하지만,이 관리자가 어린이 관리자에게 팝업을 "전파"하지 않는 것 : 라이브러리에서 FragmentActivity 코드에서, 나는 찾을 수 있습니다.

private Fragment myFragmentContainer; 

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

가 더 나은 방법이 될,보다 자동화 된 방법 수도 있지만, 내 요구 : 해결 방법 수동 활동과 같이, 자식 관리자에()를 popBackStackImmediate를 호출하는 것입니다 FragmentActivity에서 상속 괜찮아.

내 현재 프로젝트에서
+0

음, 나중에이 사진을주고 작동하면 받아 들일 것입니다. – MikeS

+0

이것은 작동하지 않는 것 같습니다. 첫째, Fragments에는 popBackStackImmediate() 메서드가 없습니다 (FragmentManagers 만 해당). 나는'this.getFragmentManager(). popBackStackImmediate()'를 대체하려고 시도했지만 기본적으로 이미 발생한 것과 다른 것을 보지 못했습니다. – MikeS

+1

당신이 나에게 준 것과 함께 작업 한 후에, 나는 해결책을 찾았습니다! 솔루션을 포함하도록 응답을 편집하고 올바른 대답으로 최대한 활용하도록 허용 한 것으로 표시합니다. – MikeS

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

답변에 일부 explantion을 추가하십시오. – DontVoteMeDown

4

우리가 내가 만 자동으로 최고 수준의 조각 관리자를위한 가기 backstack 팝업 해결 방법을 다음과 같이 왔어요, 그래서 다수의 "중첩 된 계층"이 OP를보고

@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); 
    } 
}