调用getChildFragmentManager ... commit()时,Android Activity已被销毁

时间:2018-02-16 14:16:42

标签: android android-fragments android-activity

我的申请结构是这样的:

  • ActivityMedia是主要活动,有2个标签:Photo&视频,每个标签都是FragmentCategory。

在每个标签中,第一个屏幕是类别列表,当点击一个类别时,将显示FragmentMediaList,这是该类别的媒体列表,使用以下代码:

((ActivityMedia) getActivity()).addFragment(FragmentMediaList.newInstance(mediaType, aSite, null));
  • 从Photo的FragmentMediaList单击后,它将显示Photo的FragmentCategory,视频选项卡相同

  • 在FragmentMediaList中,单击某个项目时,将显示带有此代码的ActivityMediaPlayer:

    Intent it = new Intent(getActivity(),ActivityMediaPlayer.class);
    getActivity().startActivity(it);
    
  • 从ActivityMediaPlayer点击返回时,app会显示FragmentMediaList,再次显示,将显示FragmentCategory

当我在我的设备上测试时,一切都很好,但在某些用户的设备上,当启动ActivityMediaPlayer时,ActivityMedia似乎被破坏了。当从ActivityMediaPlayer单击返回时,显示FragmentMediaList,再次单击返回,显示FragmentCategory,但是当单击FragmentCategory中的类别时,HostFragment类的这行代码中发生崩溃:

getChildFragmentManager().beginTransaction().replace(R.id.hosted_fragment, fragment).addToBackStack(null).commit();

它说“活动已被破坏”

以下是我的课程详情:

ActivityMedia:

public class ActivityMedia extends BaseActivity
    ...
    protected void onCreate(Bundle savedInstanceState) {
    viewPager = (ViewPager) findViewById(R.id.viewpager);
    tabLayout = (TabLayout) findViewById(R.id.tablayout);

    customPagerAdapter = new CustomPagerAdapter(getSupportFragmentManager());


    // increase this limit if you have more tabs!
    viewPager.setOffscreenPageLimit(1);
    viewPager.setAdapter(customPagerAdapter);
    tabLayout.setupWithViewPager(viewPager);

    ...
    @Override public void onBackPressed() {
    if(!BackStackFragment.handleBackPressed(getSupportFragmentManager())){
        super.onBackPressed();
    }
}

CustomPagerAdapter:

public class CustomPagerAdapter extends FragmentStatePagerAdapter {
private final List<String> tabTitles = new ArrayList<String>() {{
    add("VIDEO");
    add("PHOTO");
}};


private List<Fragment> tabs = new ArrayList<>();

public CustomPagerAdapter(FragmentManager fragmentManager) {
    super(fragmentManager);
    initializeTabs();
}

public CustomPagerAdapter(FragmentManager fragmentManager, Fragment fragment1, Fragment fragment2) {
    super(fragmentManager);
    tabs.add(fragment1);
    tabs.add(fragment2);
}

private void initializeTabs() {
    tabs.add(HostFragment.newInstance(FragmentSite.newInstance(MediaType.Movie)));
    tabs.add(HostFragment.newInstance(FragmentSite.newInstance(MediaType.Photo)));
}

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

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

@Override
public CharSequence getPageTitle(int position) {
    return tabTitles.get(position);

 }
}

HostFragment:

public class HostFragment extends BackStackFragment {
private Fragment fragment;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    View view = inflater.inflate(R.layout.host_fragment, container, false);
    if (fragment != null) {
        replaceFragment(fragment, false);
    }
    return view;
}

public void replaceFragment(Fragment fragment, boolean addToBackstack) {
    try{
        if (addToBackstack) {
            getChildFragmentManager().beginTransaction().replace(R.id.hosted_fragment, fragment).addToBackStack(null).commit();
        } else {
            getChildFragmentManager().beginTransaction().replace(R.id.hosted_fragment, fragment).commit();
        }
    }catch (Exception e){
        getChildFragmentManager().beginTransaction().remove(this);
        K.log("Error when commit fragment: " + e.getLocalizedMessage());
    }

}

public static HostFragment newInstance(Fragment fragment) {
    HostFragment hostFragment = new HostFragment();
    hostFragment.fragment = fragment;
    return hostFragment;
 }
}

BackStackFragment:

public abstract class BackStackFragment extends BaseFragment {
public static boolean handleBackPressed(FragmentManager fm)
{
    if(fm.getFragments() != null){
        for(Fragment frag : fm.getFragments()){
            if(frag != null && frag.isVisible() && frag instanceof BackStackFragment){
                if(((BackStackFragment)frag).onBackPressed()){
                    return true;
                }
            }
        }
    }
    return false;
}

protected boolean onBackPressed()
{
    FragmentManager fm = getChildFragmentManager();
    if(handleBackPressed(fm)){
        return true;
    } else if(getUserVisibleHint() && fm.getBackStackEntryCount() > 0){
        fm.popBackStack();
        return true;
    }
    return false;
 }
}

0 个答案:

没有答案