在ViewPager Fragment中切换后,子片段消失了

7

这是一个稍微复杂一些的问题,但我会尽可能使其易于理解。

首先,我有一个包含ViewPager的主Activity。它有两个页面,每个页面都有两个ActionBar选项卡链接到它。我还有一个抽屉,有四个选项,前两个选项是ViewPager中的两个页面,后两个选项是其他页面。如果您选择了后两个选项之一,我配置了我的ViewPager以使用另外两个Fragment替换当前的Fragment。所有这些片段都是单例的,因此来回切换不会导致任何内存问题。

切换到第二组Fragment后,其中一个Fragment中有一个FrameLayout,我使用它来在选择按钮时切换子Fragment。这就是问题所在。在该Fragment第一次加载后,它可以正常工作。但是,如果您使用抽屉将其切换回到第一组,然后再次切换回第二组,子Fragment就会消失。然后它往往会在此之后做任何其他操作时崩溃。

这是它的崩溃日志

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

你在调用 "getClassLoader()" 时出现了错误,因此问题应该出现在那里。请检查在您调用 "getClassLoader()" 的实例是否已完全初始化。 - Sulfkain
请在logcat中显示更多的日志,我觉得奇怪的是这条消息是最相关的。 - mthandr
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接