2016-07-28 34 views
9

Tôi đã cố thêm một đoạn trong một đoạn khác bên trong viewpager bằng cách sử dụng getChildFragmentManager(). Tôi đã nhận lỗi sau,ChildFragmentManager java.lang.IllegalStateException: Hoạt động đã bị hủy

java.lang.IllegalStateException: hoạt động đã bị phá hủy tại android.support.v4.app.FragmentManagerImpl.enqueueAction (FragmentManager.java:1549) tại android.support.v4.app .BackStackRecord.commitInternal (BackStackRecord.java:654) tại android.support.v4.app.BackStackRecord.commitAllowingStateLoss (BackStackRecord.java:625) tại com.lakeba.gameon.userprofile.UserProfileContainerFragment.replaceFragment (UserProfileContainerFragment.java:72)

Và tôi đã thử this workaround nhưng vẫn gặp lỗi tương tự.

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

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

bất kỳ câu trả lời cho vấn đề này? – Ramprasad

+0

https://github.com/rramprasad/TabsSample. Đây là repo github của tôi cho mẫu này để tái tạo vấn đề này. – Ramprasad

Trả lời

5

Nếu bạn nhìn vào đoạn code trong phương pháp onCreate() của bạn, bạn sẽ thấy dòng:

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

Lần đầu tiên bạn khởi tạo trường userprofileContainerFragment với một cá thể mới của UserProfileContainerFragment và sau đó ngay bên dưới bạn tạo phiên bản mới của UserProfileContainerFragment được sử dụng trong ViewPager (bạn có thể dễ dàng quan sát điều này bằng cách đặt một câu lệnh tường trình trong hàm tạo của UserProfileContainerFragment .. .bạn sẽ thấy hai trường hợp được tạo). Sau đó trong mã của bạn, bạn cố gắng sử dụng trường userProfileContainerFragment sẽ dẫn đến lỗi do trường hợp UserProfileContainerFragment không gắn liền với hoạt động (đây không phải là phân đoạn được sử dụng bởi ViewPager).

Mã của bạn sẽ giống như dưới đây, để duy trì các tài liệu tham khảo phù hợp và không tạo ra các mảnh vỡ tách ra:

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

Tuyệt vời! Sai lầm ngớ ngẩn ăn rất nhiều thời gian trong hai tuần qua! – Ramprasad

Các vấn đề liên quan