9

getChildFragmentManager()을 사용하여 뷰 페이지 내의 다른 조각 안에 조각을 추가하려고했습니다. 나는 오류 다음있어ChildFragmentManager java.lang.IllegalStateException : 활동이 파괴되었습니다

java.lang.IllegalStateException : 활동 android.support.v4.app에서 android.support.v4.app.FragmentManagerImpl.enqueueAction (FragmentManager.java:1549) 에서 을 파괴하고있다 .BackStackRecord.commitInternal (BackStackRecord.java:654) android.support.v4.app.BackStackRecord.commitAllowingStateLoss (BackStackRecord.java:625) at com.lakeba.gameon.userprofile.UserProfileContainerFragment.replaceFragment (UserProfileContainerFragment.java:72))

그리고 this workaround을 시도했지만 여전히 같은 오류가 발생합니다.

UserProfileContainerFragment.java

public class UserProfileContainerFragment extends CustomFragment { 


    private View rootView; 
    private Fragment fragment1; 

    public UserProfileContainerFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 
    } 

    public static UserProfileContainerFragment newInstance() { 
     UserProfileContainerFragment fragment = new UserProfileContainerFragment(); 
     return fragment; 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     rootView = inflater.inflate(R.layout.fragment_user_profile_container, container, false); 

     if(savedInstanceState == null) { 
      UserProfileFragment userProfileFragment = UserProfileFragment.newInstance(); 
      getChildFragmentManager().beginTransaction() 
        .replace(R.id.user_profile_container, userProfileFragment) 
        .commitAllowingStateLoss(); 
     } 

     return rootView; 
    } 

    /*@Override 
    public void onSaveInstanceState(Bundle outState) { 
     //super.onSaveInstanceState(outState); 
    }*/ 

    public void replaceFragment(Fragment fragment, boolean addToBackStack){ 
     fragment1 = fragment; 
     if(addToBackStack){ 
      /*getChildFragmentManager().beginTransaction() 
        .replace(R.id.user_profile_container, fragment) 
        .addToBackStack(null) 
        .commit();*/ 
      getChildFragmentManager().beginTransaction() 
        .replace(R.id.user_profile_container, fragment) 
        .addToBackStack(null) 
        .commit(); 
        //.commitAllowingStateLoss(); 
     } 
     else{ 
      getChildFragmentManager().beginTransaction() 
        .replace(R.id.user_profile_container, fragment) 
        .commit(); 
        //.commitAllowingStateLoss(); 
     } 

    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 

     try { 
      Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager"); 
      childFragmentManager.setAccessible(true); 
      childFragmentManager.set(this, null); 

     } catch (NoSuchFieldException e) { 
      throw new RuntimeException(e); 
     } catch (IllegalAccessException e) { 
      throw new RuntimeException(e); 
     } 

    } 
} 

HomeMapActivity.java 당신이 당신의에서 onCreate() 메소드의 코드를 보면 당신은 라인을 볼 수

public class HomeMapActivity extends AppCompatActivity implements UserProfileFragment.OnUserProfileFragmentListener{ 

    private Toolbar homeToolbar; 
    private ViewPager homeViewPager; 
    private TabLayout homeTabLayout; 
    private UserProfileContainerFragment userProfileContainerFragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_home_map); 

     /*homeToolbar = (Toolbar) findViewById(R.id.home_toolbar); 
     setSupportActionBar(homeToolbar); 

     getSupportActionBar().setDisplayHomeAsUpEnabled(true);*/ 

     homeViewPager = (ViewPager) findViewById(R.id.home_view_pager); 

     HomeViewPagerAdapter homeViewPagerAdapter = new HomeViewPagerAdapter(getSupportFragmentManager()); 
     userProfileContainerFragment = new UserProfileContainerFragment(); 
     homeViewPagerAdapter.addFragment(new UserProfileContainerFragment(),"Profile"); 
     homeViewPager.setAdapter(homeViewPagerAdapter); 

     homeTabLayout = (TabLayout) findViewById(R.id.home_tabs); 
     homeTabLayout.setupWithViewPager(homeViewPager); 
     setTabIcons(homeTabLayout); 


     homeTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 
       int tabPosition = tab.getPosition(); 
       tab.setIcon(tabIconsArrayActivated[tabPosition]); 
      } 

      @Override 
      public void onTabUnselected(TabLayout.Tab tab) { 
       int tabPosition = tab.getPosition(); 
       tab.setIcon(tabIconsArray[tabPosition]); 
      } 

      @Override 
      public void onTabReselected(TabLayout.Tab tab) { 
       int tabPosition = tab.getPosition(); 
       tab.setIcon(tabIconsArrayActivated[tabPosition]); 
      } 
     }); 

     homeTabLayout.getTabAt(1).select(); 
    } 

    private void setTabIcons(TabLayout homeTabLayout) { 
     homeTabLayout.getTabAt(0).setIcon(tabIconsArray[0]); 
     homeTabLayout.getTabAt(1).setIcon(tabIconsArray[1]); 
     homeTabLayout.getTabAt(2).setIcon(tabIconsArray[2]); 
     homeTabLayout.getTabAt(3).setIcon(tabIconsArray[3]); 
    } 

    @Override 
    public void onUserProfileEditButtonClicked() { 
     userProfileContainerFragment.replaceFragment(EditUserProfileFragment.newInstance(),true); 
    } 

    private class HomeViewPagerAdapter extends FragmentStatePagerAdapter{ 

     private final List<Fragment> mFragmentList = new ArrayList<>(); 
     private final List<String> mFragmentTitleList = new ArrayList<>(); 

     public HomeViewPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return mFragmentList.get(position); 
     } 

     @Override 
     public int getCount() { 
      return mFragmentList.size(); 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      //return mFragmentTitleList.get(position); 
      return null; 
     } 

     public void addFragment(Fragment fragment,String title){ 
      mFragmentList.add(fragment); 
      mFragmentTitleList.add(title); 
     } 
    } 
} 
+0

이 문제에 대한 답 :

코드는 적절한 기준을 유지하고 분리 된 조각을 만들려면 아래처럼해야합니까? – Ramprasad

+0

https://github.com/rramprasad/TabsSample. 이것은이 샘플을이 github repo로 재현 한 것입니다. – Ramprasad

답변

5

:

userProfileContainerFragment = new UserProfileContainerFragment(); 
homeViewPagerAdapter.addFragment(new UserProfileContainerFragment(),"Profile"); 

먼저 UserProfileContainerFragment 필드를 UserProfileContainerFragment의 새 인스턴스로 초기화 한 다음 바로 아래에있는 ViewAppager에 사용되는 UserProfileContainerFragment 인스턴스를 만듭니다 (UserProfileContainerFragment의 생성자에 로그 문을 넣어 쉽게 볼 수 있습니다). 두 인스턴스가 생성되는 것을 볼 수 있습니다). 나중에 코드 내에서 userProfileContainerFragment 필드를 사용하면 UserProfileContainerFragment의 인스턴스가 Activity에 전혀 연결되지 않아 오류가 발생합니다 (ViewPager에서 사용하는 조각이 아닙니다).

userProfileContainerFragment = new UserProfileContainerFragment(); 
homeViewPagerAdapter.addFragment(userProfileContainerFragment,"Profile"); 
+1

좋아요! 어리석은 실수는 지난 2 주 동안 많은 시간을 먹는다! – Ramprasad

관련 문제