首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >交换后,View Pager片段中的子片段消失

交换后,View Pager片段中的子片段消失
EN

Stack Overflow用户
提问于 2014-01-11 06:14:19
回答 1查看 2.2K关注 0票数 7

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

首先,我有一个带有视图分页的主活动。它有2个页面,每个页面有2个动作栏标签链接。我还有一个抽屉,它有4个选项,前2个是视图分页中的2个页面,后2个是不是的页面,如果你选择了后2个页面中的一个,我配置了我的ViewPager来与其他2个页面交换碎片。所有这些片段都是单例的,因此来回切换不会导致任何内存问题。

在切换到第二组片段时,其中一个片段中有一个框架,我用它在按钮被选中时换出子片段。这就是问题所在。在第一次加载该片段之后,它工作得很好。但是,如果您使用抽屉切换到第一个集合,然后再次切换到第二个集合,那么子片段就会消失。在此之后,它往往会在您执行其他任何操作后崩溃。

这是它的崩溃日志

代码语言:javascript
复制
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

如果我稍微修改一下代码,我会得到类似这样的结果。这两个错误似乎是我最常犯的错误:

代码语言:javascript
复制
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

我可以继续在frame视图上调用replace(),所以它不会消失。因此,我猜这不是问题所在。它

这里有一些相关的代码。

片段的代码:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
@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));
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2015-04-08 01:55:31

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21055426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档