ChildFragmentManager java.lang.IllegalStateException: Activity has been destroyed 子片段管理器 java.lang.IllegalStateException:活动已被销毁

9
我尝试使用getChildFragmentManager()在viewpager中的另一个碎片内添加碎片,但出现以下错误:

java.lang.IllegalStateException: Activity has been destroyed 在android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1549) 在android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:654) 在android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:625) 在com.lakeba.gameon.userprofile.UserProfileContainerFragment.replaceFragment(UserProfileContainerFragment.java:72)

我尝试了这个解决方法,但仍然出现相同的错误。 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);
        }
    }
}

有关这个问题的任何答案吗? - Ramprasad
这是我的Github存储库,用于复制此问题的示例:https://github.com/rramprasad/TabsSample。 - Ramprasad
1个回答

5
如果您查看onCreate()方法中的代码,您会看到以下几行代码:
userProfileContainerFragment = new UserProfileContainerFragment();
homeViewPagerAdapter.addFragment(new UserProfileContainerFragment(),"Profile");

你首先要使用一个新的UserProfileContainerFragment实例来初始化userProfileContainerFragment字段,然后在下面创建一个新的UserProfileContainerFragment实例,并将其用于ViewPager(你可以通过在UserProfileContainerFragment构造函数中放置日志语句轻松观察到这一点...你将看到创建了两个实例)。稍后在你的代码中,你尝试使用userProfileContainerFragment字段,但由于该实例的UserProfileContainerFragment根本没有附加到活动上(这不是ViewPager使用的片段),你会遇到失败。
为了保持正确的引用并不创建分离的片段,你的代码应该如下所示:
userProfileContainerFragment = new UserProfileContainerFragment();
homeViewPagerAdapter.addFragment(userProfileContainerFragment,"Profile");

1
太好了!愚蠢的错误浪费了我过去两周的很多时间! - Ramprasad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接