我的申请结构是这样的:
在每个标签中,第一个屏幕是类别列表,当点击一个类别时,将显示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;
}
}