android – 视图寻呼机片段中的子片段在交换后消失

所以这是一个复杂的问题,但我会尽量让它变得容易.

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

在切换到第二组片段时,其中一个片段中有一个框架,用于在选择按钮时交换子片段.这就是问题所在.在第一次加载该片段后,它可以正常工作.但是如果你使用抽屉切换到第一组,然后再次回到第二组,子片段就会消失.在那之后你做任何其他事情后,它往往会崩溃.

这是它的崩溃日志

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").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.

相关文章

Android 如何解决dialog弹出时无法捕捉Activity的back事件 在...
Android实现自定义带文字和图片的Button 在Android开发中经常...
Android 关于长按back键退出应用程序的实现最近在做一个Andr...
android自带的时间选择器只能精确到分,但是对于某些应用要求...