fragment中嵌套viewpager的问题

bigggge 2015-10-27 06:09:28

我的主activity包含两个fragment,他们是由replaceFragmentWithSelected方法进行切换的

  protected void replaceFragmentWithSelected(Fragment fragment) {

FragmentTransaction fragmentTransaction = this
.getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frame_content, fragment);
fragmentTransaction.commit();

}

这两个fragment都有各自的viewpager
 
public class CommunityFragment extends BaseFragment {
private CommonTitleBar titleBar;
private View view;
private PagerSlidingTabStrip tabs;
private ViewPager pager;
private CommunicatePagerAdapter adapter;
private ArrayList<Fragment> fragmentList;
private Communication communication;
private QuanZi quanZi;
private Story story;
private final String[] titles = {"交流", "圈子", "故事"};
SicknessChangedReceiver sicknessChangedReceiver;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sicknessChangedReceiver = new SicknessChangedReceiver();
IntentFilter intentFilter = new IntentFilter("xp.yhx.com");
getActivity().registerReceiver(sicknessChangedReceiver, intentFilter);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (view == null) {
view = inflater.inflate(R.layout.fragment_community, null);
initViews();
initPager();
}
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null) {
parent.removeView(view);
}
// replaceFragmentWithSelected(communication);
return view;
}

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);
}
}

@Override
public void onDestroy() {
super.onDestroy();
getActivity().unregisterReceiver(sicknessChangedReceiver);
}


private void initViews() {
communication = Communication.newInstance("2");
quanZi = QuanZi.newInstance("2");
story = Story.newInstance("2");
fragmentList = new ArrayList<>();
fragmentList.add(communication);
fragmentList.add(quanZi);
fragmentList.add(story);

tabs = (PagerSlidingTabStrip) view.findViewById(R.id.tabs);
titleBar = (CommonTitleBar) view.findViewById(R.id.title_layout);
titleBar.setLeftButtonColorDefault();
titleBar.setRightButtonColorDefault();
titleBar.setLeftBtnOnclickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), MultiTagActivity.class);
intent.putExtra("isFromCom", true);
intent.putExtra("tag", 1);
startActivity(intent);
}
});
titleBar.setRightBtnOnclickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (TextUtils.isEmpty(SPUtils.getInstance(getActivity()).getValue("id"))) {
new MaterialDialog.Builder(getActivity())
.content("请先登录你的账号")
.positiveText("登录")
.negativeText("返回")
.cancelable(false)
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
Intent intent = new Intent(getActivity(), LoginActivity.class);
startActivity(intent);
}
}
).show();
} else {
initDialog();
}
}
});
}

private void initPager() {
pager = (ViewPager) view.findViewById(R.id.pager);
adapter = new CommunicatePagerAdapter(titles, getChildFragmentManager(), fragmentList);
pager.setAdapter(adapter);
pager.setOffscreenPageLimit(3);
tabs.setViewPager(pager);
}

private void initDialog() {
new MaterialDialog.Builder(getActivity())
.items(new String[]{"发起我的交流", "分享我的故事"})
.itemsCallback(new MaterialDialog.ListCallback() {
@Override
public void onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
if (which == 0) { //交流
startActivityForResult(new Intent(getActivity(), StartStoryActivity.class).putExtra("type", 1), 1);
} else if (which == 1) {//故事
startActivityForResult(new Intent(getActivity(), StartStoryActivity.class).putExtra("type", 3), 3);
}
}
})
.show();
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (resultCode) {
case 2003:
pager.setCurrentItem(2, false);
break;
case 2001:
pager.setCurrentItem(0, false);
break;
}
}

这是adapter
public class CommunicatePagerAdapter extends FragmentPagerAdapter{
String[] titles;
List<Fragment> lists;
FragmentManager fm;

public CommunicatePagerAdapter(String[] titles, FragmentManager fm, List<Fragment> lists) {
super(fm);
this.fm = fm;
this.titles = titles;
this.lists = lists;
}

@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}

@Override
public int getCount() {
return 3;
}

@Override
public Fragment getItem(int arg0) {
// Fragment fragment;
// switch (arg0) {
// case 0:
// return Communication.newInstance("2");
// case 1:
// return QuanZi.newInstance("2");
//
// default:
// return Story.newInstance("2");
//
// }
return lists.get(arg0);
}

@Override
public void destroyItem(android.view.ViewGroup aContainer, int aPosition, java.lang.Object aObject) {
if (aPosition <= getCount() && aObject != null) {
FragmentTransaction trans = fm.beginTransaction();
trans.remove((Fragment) aObject);
trans.commit();
}
}

}

当我第一次进入主activity的两个fragment时,他们的子fragment都能正常显示,但第二次就不行了,报pager空指针,然后我尝试在onCreateView方法中view!=null时initPager();,报activity has been destroyed 错误,我应该怎么改,才能使两个fragment中的两个viewpager都生效?谢谢
...全文
197 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧