2016-07-28 11 views
9

मैंने getChildFragmentManager() का उपयोग करके व्यूपर के अंदर एक और टुकड़े के अंदर एक टुकड़ा जोड़ने की कोशिश की है। मैं त्रुटि निम्न कर ली,ChildFragmentManager java.lang.IleglegalStateException: गतिविधि को नष्ट कर दिया गया है

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) पर 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

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/Tabs नमूना। इस मुद्दे को पुन: उत्पन्न करने के लिए इस नमूने के लिए यह मेरा जिथब रेपो है। – Ramprasad

उत्तर

5

आप अपने OnCreate() विधि में कोड को देखें, तो आप लाइनों देखेंगे:

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

आप पहले UserprofileContainerFragment फ़ील्ड को UserProfileContainerFragment के एक नए उदाहरण के साथ प्रारंभ करते हैं और फिर नीचे नया ViewPager में उपयोग करने के लिए UserProfileContainerFragment का उदाहरण बनाते हैं (आप आसानी से UserProfileContainerFragment के निर्माता में लॉग स्टेटमेंट डालकर देख सकते हैं .. आप दो उदाहरण बनाएंगे)। बाद में आपके कोड में आप क्षेत्र उपयोगकर्ता का उपयोग करने का प्रयास करेंप्रोफाइलकंटनर फ़्रेगमेंट जो विफलता का कारण बन जाएगा क्योंकि UserProfileContainerFragment की उस घटना को गतिविधि से जुड़ा नहीं है (यह व्यूपागर द्वारा उपयोग किया जाने वाला खंड नहीं है)।

आपका कोड के नीचे की तरह दिखना चाहिए, उचित संदर्भ बनाए रखने के लिए और अलग टुकड़े नहीं बना:

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

बढ़िया! मूर्खतापूर्ण गलती पिछले दो हफ्तों के लिए बहुत समय खाती है! – Ramprasad

संबंधित मुद्दे