2013-11-01 3 views
28

FragmentTransaction이 완료되었을 때 이벤트를 가질 수 있습니까?FragmentTransaction이 완료 될 때의 이벤트

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
ft.replace(R.id.content_frame, fragment).commit(); 

는 사실, 난 내 응용 프로그램의 서랍을 사용하고 난 트랜잭션이 내 작업 표시 줄의 메뉴를 변경 완료되면 invalidateOptionsMenu();를 트리거하고 싶습니다.

답변

31

당신은 당신이 당신의 커밋() 함수 호출 후

getSupportFragmentManager().executePendingTransactions(); 

를 호출 할 수 있습니다, 완료 조각 트랜잭션 기다릴 필요가 없습니다.

이렇게하면 트랜잭션이 완료됩니다.

+4

내 문제는 내 거래가 잘 진행되었는지 여부가 아니라 완료 시점을 아는 것입니다. 그렇지 않으면, 내보기의 표시 사이에 간격이 있으며 내 작업의 메뉴 표시 줄을 변경합니다. –

+0

executePendingTransactions를 호출하면 트랜잭션이 강제 종료됩니다. 여태까지는 뷰가로드되는 데 시간이 걸립니다. 이를 확인하려면 정적 함수를 사용하여 조각의 onResume에서 호출하십시오. –

+2

나는 이것이 "이벤트"가 아닌 경우에도 유효한 대답이라고 생각합니다. executePendingTransactions()는 트랜잭션이 완료 될 때까지 * 차단합니다. 트랜잭션이 완료되면 이벤트가 발생하는 것처럼 호출되고 이벤트 리스너의 오버 헤드가없는 경우에도 다음 명령이 호출됩니다. – auval

3

this answer에 제공된 조언을 사용할 수 있습니다. 트랜잭션 완료 후 필요한 코드를 onAnimationEnd 메소드에서 실행할 수 있습니다.

이렇게하려면 FragmentTransaction에서 예를 들어를 사용하여 애니메이션을 설정해야합니다.

transaction.setCustomAnimations(R.anim.slide_in_left, 
           R.anim.slide_out_right); 
8

Hei! 이 시도 :

private OnBackStackChangedListener backStackListener = new OnBackStackChangedListener() { 

    @Override 
    public void onBackStackChanged() { 
     String name = ""; 
     int position = getSupportFragmentManager().getBackStackEntryCount(); 
     if(position!=0){ 
      FragmentManager.BackStackEntry backEntry=getSupportFragmentManager().getBackStackEntryAt(position-1); 
      name=backEntry.getName(); 


     } 
     if(position==0){ 
      mainActionBar(); 
     } 
     else if(name=="someWord"){ 
      mainActionBar2(); 
     } 
     else{ 
      mainActionBar3(); 
     } 

    } 
}; 
getSupportFragmentManager().addOnBackStackChangedListener(backStackListener); 

및 거래에

는 다음과 같이 가기 backstack에 태그를 추가

getSupportFragmentManager().beginTransaction() 
       .replace(R.id.main, SomeFragment.newInstance(some argument)) 
       .addToBackStack("someWord").commit(); 
하여 FragmentTransaction이 완료
+0

사용자 정의 애니메이션을 추가하지 않는 경우에만 유효합니다. –

+3

전환 시작시 'onBackStackChanged'get이 호출됩니다. 이것은 결코 유효하지 않습니다. – Servus7

0

commit() 대신 commitNow()를 사용하면 트랜잭션이 완료되었는지 확인할 수 있습니다. 물론 트랜잭션을 수행해야하는지 여부는 트랜잭션의 복잡성에 달려 있습니다.

관련 문제