View Pager fragment中的子片段交换后会消失



所以这是一个有点复杂的问题,但我会尽量让它变得容易理解。

首先,我有一个带有视图寻呼机的主要活动。其中有2个页面,每个页面有2个操作栏选项卡链接。我还有一个抽屉,里面有4个选项,前两个是视图寻呼机中的两个页面,第二个是没有的页面。如果您选择第二个2中的一个,我将ViewPager配置为用另外两个片段交换片段。所有这些片段都是singleton,因此来回切换不会导致任何内存问题。

在切换到第二组片段时,其中一个片段中有一个框架,当选择按钮时,我用它来交换子片段。这就是问题所在。在第一次加载该片段之后,它运行良好。但是,如果你用抽屉切换到第一组,然后再回到第二组,那么子片段就不见了。然后,在你做了任何其他事情之后,它往往会崩溃。

这是的故障日志

01-10 15:55:05.272: E/MessageQueue-JNI(21034): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(android.support.v4.app.Fragment)' on a null object reference

如果我稍微摆弄一下代码,就会得到这样的东西。这两个错误似乎是我产生最多的错误:

01-10 16:00:13.072: E/AndroidRuntime(22227): java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.ClassLoader android.support.v4.app.FragmentActivity.getClassLoader()' on a null object reference

我可以继续对框架视图调用replace(),这样它就不会消失。所以我猜这不是问题所在。它

这里有一些相关的代码。

碎片的代码:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.calculator, container, false);
final FragmentManager fragmentManager = getChildFragmentManager();
if(afFrag == null && topFrag == null){
afFrag = CalculatorAfFragment.getInstance();
topFrag = CalculatorTopFragment.getInstance();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.calc_frame, afFrag, "afFrag").commit();
}
RadioGroup typeGroup = (RadioGroup) view.findViewById(R.id.type_buttons);        
typeGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() 
{
public void onCheckedChanged(RadioGroup group, int checkedId) {
if (checkedId == R.id.af_button){
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.calc_frame, afFrag, "afFrag").commit();
}
else if (checkedId == R.id.top_button){
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.calc_frame, topFrag, "topFrag").commit();
} 
}
});
return view;

FragmentStatePagerAdapter代码:

@Override
public Fragment getItem(int position) {
if(tools){
return toolsFragmentsList.get(position);
} else {
return guidesFragmentsList.get(position);
}
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
public void swapFragments(int position){
if (tools){
tools = false;
stores = false;
notifyDataSetChanged();
this.setPrimaryItem(mPager, position-1, getItem(position - 1));
} else {
tools = true;
notifyDataSetChanged();
this.setPrimaryItem(mPager, position-4, getItem(position - 4));
}
}

尝试通过mPager.setId(View.generateViewId())ViewPager上设置唯一ID。

最新更新