一个片段中显示片段viewpager [英] Display fragment viewpager within a fragment

本文介绍了一个片段中显示片段viewpager的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有包含ViewPager一个片段。所述ViewPager已与包含一组片段适配器相关联。

在加载父片段,我遇到了一个 IllegalStateException异常与消息: java.lang.IllegalStateException:递归进入executePendingTransactions

一些研究已经使我,该系统是另一个片段内无法显示片段的结论,但是似乎有一些迹象表明,有可能恰好为此与使用ViewPager的(<一href="http://stackoverflow.com/questions/7241153/a-bug-in-viewpager-using-it-with-other-fragment/7654881#7654881">A用它与其他片段的错误,在ViewPager)。

事实上,如果我添加一个按钮,我父母片段调用 mPager.setAdapter(mAdapter)在我ViewPager时pressed的ViewPager成功加载。这是不理想的。

问题,则必须与该片段的生命周期。因此,我的问题,是这样的: 有其他人找到了解决这个问题的一种方式,如果是的话,怎么办?

有没有一些方法来延迟设置在ViewPager适配器,直到片段交易后?

下面是我的父母片段code:

  @覆盖
公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,捆绑savedInstanceState){

    MVIEW = inflater.inflate(R.layout.team_card_master,集装箱,假);
    mViewPager =(ViewPager)mView.findViewById(R.id.team_card_master_view_pager);

    最后Button按钮=(按钮)mView.findViewById(R.id.load_viewpager_button);
    button.setOnClickListener(新OnClickListener(){
        @覆盖
        公共无效的onClick(视图v){
            mViewPager.setAdapter(mAdapter);
            button.setVisibility(View.GONE);
        }
    });

    mAdapter =新ViewPagerAdapter(getFragmentManager());
 // mViewPager.setAdapter(mAdapter);

    返回MView的;
}
 

和适配器:

 公共类ViewPagerAdapter扩展FragmentPagerAdapter {
    公共ViewPagerAdapter(FragmentManager FM){
        超(FM);
    }

    @覆盖
    公众诠释getCount将(){
        如果(mCursor == NULL)返回0;
        否则返回mCursor.getCount();
    }

    @覆盖
    公共片段的getItem(INT位置){
        叠B = createBundle(位置,mCursor);
        返回TeamCardFragment.newInstance(B);
    }
}
 

解决方案

使用的AsyncTask来设置viewPager适配器。这对我的作品。的AsyncTask的是使原始片段完成它的过渡。然后我们继续viewPager片段,基本上避免递归。

  @覆盖
公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,捆绑savedInstanceState){

    MVIEW = inflater.inflate(R.layout.team_card_master,集装箱,假);
    mViewPager =(ViewPager)mView.findViewById(R.id.team_card_master_view_pager);

    最后Button按钮=(按钮)mView.findViewById(R.id.load_viewpager_button);
    button.setOnClickListener(新OnClickListener(){
        @覆盖
        公共无效的onClick(视图v){
            mViewPager.setAdapter(mAdapter);
            button.setVisibility(View.GONE);
        }
    });

    mAdapter =新ViewPagerAdapter(getFragmentManager());
    新setAdapterTask()执行()。

    返回MView的;
}

私有类setAdapterTask扩展的AsyncTask&LT;虚空,虚空,虚空&GT; {
      保护无效doInBackground(虚空...... PARAMS){
            返回null;
        }

        @覆盖
        保护无效onPostExecute(无效的结果){
                   mViewPager.setAdapter(mAdapter);
        }
}
 

I have a fragment which contains a ViewPager. The ViewPager is associated with an adapter that contains a set of fragments.

Upon loading the parent fragment, I am met with an IllegalStateException with the message: java.lang.IllegalStateException: Recursive entry to executePendingTransactions.

Some research has led me to the conclusion that the system is unable display fragments within another fragment, HOWEVER there seems to be some indication that it is possible to do exactly this with the use of a ViewPager (A bug in ViewPager using it with other fragment).

In fact, if I add a button to my parent fragment which calls mPager.setAdapter(mAdapter) on my ViewPager when pressed, the ViewPager successfully loads. This is not ideal.

The issue then must be related to the fragment lifecycle. My question therefore, is this: Has anybody else found a way around this issue, and if so, how?

Is there some way to delay settings the adapter on the ViewPager until after the fragment transaction?

Here is my parent fragment code:

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    mView = inflater.inflate(R.layout.team_card_master, container, false);
    mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager);

    final Button button = (Button)mView.findViewById(R.id.load_viewpager_button);
    button.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            mViewPager.setAdapter(mAdapter);
            button.setVisibility(View.GONE);
        }
    });

    mAdapter = new ViewPagerAdapter(getFragmentManager());
 //     mViewPager.setAdapter(mAdapter);

    return mView;
}

And the adapter:

public class ViewPagerAdapter extends FragmentPagerAdapter {
    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        if (mCursor == null) return 0;
        else return mCursor.getCount();
    }

    @Override
    public Fragment getItem(int position) {
        Bundle b = createBundle(position, mCursor);
        return TeamCardFragment.newInstance(b);
    }
}

解决方案

use AsyncTask to set the adapter for viewPager. It works for me. The asyncTask is to make the original fragment complete it's transition. and then we proceed with viewPager fragments, basically to avoid recursion.

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    mView = inflater.inflate(R.layout.team_card_master, container, false);
    mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager);

    final Button button = (Button)mView.findViewById(R.id.load_viewpager_button);
    button.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            mViewPager.setAdapter(mAdapter);
            button.setVisibility(View.GONE);
        }
    });

    mAdapter = new ViewPagerAdapter(getFragmentManager());
    new setAdapterTask().execute();

    return mView;
}

private class setAdapterTask extends AsyncTask<Void,Void,Void>{
      protected Void doInBackground(Void... params) {
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
                   mViewPager.setAdapter(mAdapter);
        }
}

这篇关于一个片段中显示片段viewpager的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆