2016-07-28 16 views
9

Ich habe versucht, ein Fragment in einem anderen Fragment in Viewpager mit getChildFragmentManager() hinzuzufügen. Ich habe folgende Fehler,ChildFragmentManager java.lang.IllegalStateException: Aktivität wurde zerstört

java.lang.IllegalStateException: Aktivität wurde bei android.support.v4.app.FragmentManagerImpl.enqueueAction (FragmentManager.java:1549) bei android.support.v4.app zerstört .BackStackRecord.commitInternal (BackStackRecord.java:654) bei android.support.v4.app.BackStackRecord.commitAllowingStateLoss (BackStackRecord.java:625) bei com.lakeba.gameon.userprofile.UserProfileContainerFragment.replaceFragment (UserProfileContainerFragment.java:72)

Und ich versuchte this workaround, aber immer noch den gleichen Fehler.

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

eine Antwort für dieses Problem? – Ramprasad

+0

https://github.com/rramprasad/TabsSample. Dies ist mein GitHub Repo für dieses Beispiel, um dieses Problem zu reproduzieren. – Ramprasad

Antwort

5

Wenn Sie den Code in Ihre onCreate() -Methode aussehen werden Sie die Linien sehen:

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

Zuerst initialisieren Sie das userprofileContainerFragment-Feld mit einer neuen Instanz von UserProfileContainerFragment und erstellen dann direkt unter eine neue Instanz von UserProfileContainerFragment zur Verwendung im ViewPager (Sie können dies leicht beobachten, indem Sie im Konstruktor von UserProfileContainerFragment eine Protokollanweisung platzieren. .dass zwei Instanzen erstellt werden. Später in Ihrem Code versuchen Sie, das Feld userProfileContainerFragment zu verwenden, das zu einem Fehler führen wird, da die Instanz von UserProfileContainerFragment überhaupt nicht an die Aktivität angefügt ist (dies ist nicht das vom ViewPager verwendete Fragment).

Der Code sollte wie folgt aussehen, die richtige Referenz zu erhalten und schaffen nicht abgelösten Bruchstücke:

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

Großartig! Dummer Fehler isst viel Zeit für die letzten zwei Wochen! – Ramprasad