2016-08-26 2 views
1

사용자가 다른 작업을 수행 할 때 DialogFragments을 /에 동적으로 추가/제거하려고합니다. 문제는 FragmentManager이 제대로 제거하지 못한다는 것입니다. 나는 remove() 함수를 호출하기 때문에, 왜이 Fragments이 제거되지 않는지 궁금합니다. 온라인으로 검색 한 결과 제거 방법은 FragmentManager에서 Fragments을 제거하기 위해 사용해야한다고 사람들이 말한 것입니다. 표시되는 것을 보여주는FragmentManager가 동적으로 추가 된 조각을 삭제하지 않음

  // originally added `LoginRestFragment` with TAG_LOGIN_REST_FRAGMENT tag to Fragment Manager 
      rest = new SettingsDialogFragment(); 
      FragmentManager fm = getFragmentManager(); 
      rest.setArguments(bundle); 
      Fragment fragment = fm.findFragmentByTag(TAG_LOGIN_REST_FRAGMENT); 
      Log.d("frag_type", fragment.toString()); 
      fm.beginTransaction().remove(fragment).commit(); 
      fragment = fm.findFragmentByTag(TAG_LOGIN_REST_FRAGMENT); 
      Log.d("is_frag_removed", fragment.toString()); 
      // why does this return a Fragment type ^^ shouldn't it throw null errror? 
      Log.d("rest", rest.toString()); 
      //^this shows rest has been updated from LoginRestFrament to SettingsDialogFragment 
      fm.beginTransaction().add(rest, TAG_LOGIN_REST_FRAGMENT).commit(); 
      fragment = fm.findFragmentByTag(TAG_LOGIN_REST_FRAGMENT); 
      Log.d("frag_type", fragment.toString()); 
      // why is this not SettingsDialogFragment?? 

로그 문 : 내가 뭐하는 거지 보여주는 아래

예제 코드를. 화면에 표시되는 것은 더 이상 LoginRestFragment가 아니라 SettingsDialogFragment (예상 한대로)이고 rest는 클래스 변수입니다.

D/frag_type: LoginRestFragment 
D/is_frag_removed: LoginRestFragment 
D/rest: SettingsDialogFragment 
D/frag_type: LoginRestFragment 
+1

커밋을 실제로 완료하기 전에 UI 스레드주기가 완료 될 때까지 기다려야한다고 생각합니다. – DeeV

답변

1

DeeV! 당신이 말한 것은 사실이며, 이것이 해결 방법을 찾은 것입니다.이 문제를 해결하려면 this StackOverflow 항목을 사용하십시오. 기본적으로 FragmentManagerexecutePendingTransactions()을 사용하여 커밋을 동적으로 만들 수 있습니다.

관련 문제