2014-09-19 6 views
14

프래그먼트를 사용하는 중에 이상한 문제가 발생했습니다.프래그먼트 PopBackStack

나는 한 조각의 활동이 있습니다

1 단계를 :

이것은에서 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에 또 하나의 조각을 추가 한 후 :

3 단계는 여기

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

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

는 문제입니다 : 여기

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

내 조각의 활동 onBackPressedButton Lisetener한다 내가 받고있는 것 :

3 단계에서 뒤로 누르면,에 대한 설명에 따라 성공적으로 이전 단편이 제공됩니다. BackPressed, 그것은 popbackstack 것이며 이전 조각으로 나를 데려다 줄 것입니다. 하지만 Fragment_More에서 다시 누를 때 빈 조각 콘텐츠가 표시됩니다. 그것은 활동의 OnCreate에서 1 단계에 추가 한 첫 번째 조각을 보여주지 않습니다.

의견을주십시오. 내가 뭘 잘못하고 있니?

감사

+0

사용하는 조각에 대한 조각 클래스를 제공 할 수 있습니까? –

+0

사실 내가 잘못한 것을 볼 수는 없습니다. 실제로 당신이 묘사 한 내용을 최대한 많이 재현 해 냈고 정상적으로 작동합니다. 나는 당신이 보여주지 않는 코드에서 뭔가를 추측하고있다. 나는 당신이 문제의 원인이 될 수있는 다른 조각 내부에서 활동의 단편을 변경하고 있음을 주목한다. (당신은 당신의 활동에서 청취자를 사용하는 것에 대해 생각하고 싶을 것이다.). –

+0

이것을 확인하십시오 http://stackoverflow.com/questions/32132623/onback-pressed-data-not-showing-in-fragments –

답변

38

당신은 당신이했던 작업을 취소합니다 리턴 키를 누르면 같이 가기 backstack에 첫 번째 조각을 추가 할 것이다. 따라서 프래그먼트를 대체하고 뒤로 누르면 다시 한 번 대체합니다. 그러나 '.add()'조각 트랜잭션을 다시 누르면 간단히 제거되고 빈 페이지가 표시됩니다. 그래서 나는 backstack에서 첫 번째 조각을 제거하는 것이 트릭을해야한다고 생각합니다. 그것을 밖으로 시도하고 알려주세요!

@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()"(라는 두 개의 조각을 가정 해 봅시다 = 작업의 반대 방향으로 저장). 조각을 저장하면됩니다. A을 클릭하면 뒤로 이동합니다.

또한 .replace() 조각 조각 B에 의해 , 그리고 경우 "addToBackStack()는"당신은 당신이 다시 클릭 작업을 같이을 제거 B을 저장하고 추가 할 것입니다.

그래서 처음으로 조각 트랜잭션을 백 스택에 추가하는 것이 좋지 않은 이유를 알 수 있습니까? 단지 빈 페이지가 생겨 뒤쪽을 눌러 조각 을 제거하게됩니다. 희망이 충분 정보입니다.

또한 첫 번째 조각에 addToBackStack()을 제거한 후에는 onBackPressed()을 재정의 할 필요가 없으므로이를 처리 할 수 ​​있습니다. 빈 페이지를 먼저 표시하지 않고 백 스택에 아무것도 남아 있지 않을 때 활동을 마칩니다.

0

이를 사용하려면이 manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();

시도를 사용하는 대신 manager.beginTransaction().replace(R.id.frameContent, home).addToBackStack("home").commit();

는 작동 알려줘 U

+0

아니요. 도움이되지 않았습니다. –

+0

제 응답 @ GauravArora를 사용해 볼 수 있습니까? – Chris

+0

예, 시도했지만 그때 만 대답했습니다. –

2

귀하의 라인 :

if(fm.getBackStackEntryCount() > 1){ 

가 있어야한다 :

if (fm.getBackStackEntryCount() > 0) { 

뒷면에 3 개의 조각이 있습니다. 처음 두 항목을 꺼낸 후에는 백 스택의 항목 수가 1이됩니다. 따라서 백 스택에 추가 한 첫 번째 조각을 가져 오는 것을 방지 할 수 있습니다.