在片段中显示片段viewpager

how*_*ttl 55 android android-lifecycle android-fragments android-viewpager android-nested-fragment

我有一个包含ViewPager的片段.ViewPager与包含一组片段的适配器相关联.

在加载父片段后,我遇到了一条IllegalStateException消息:java.lang.IllegalStateException: Recursive entry to executePendingTransactions.

一些研究使我得出结论,系统无法在另一个片段中显示片段,但是似乎有一些迹象表明可以通过使用ViewPager完成此操作(ViewPager中的一个错误与其他片段一起使用)).

实际上,如果我向我的父片段添加一个按钮,mPager.setAdapter(mAdapter)在按下时调用我的ViewPager,ViewPager会成功加载.这不太理想.

那么问题必须与片段生命周期有关.因此,我的问题是:有没有其他人找到解决这个问题的办法,如果是,怎么办?

有没有办法在片段事务之后延迟ViewPager上的适配器设置?

这是我的父片段代码:

    @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;
}
Run Code Online (Sandbox Code Playgroud)

和适配器:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Yas*_*mar 60

使用AsyncTask为viewPager设置适配器.这个对我有用.asyncTask是使原始片段完成它的转换.然后我们继续使用viewPager片段,基本上是为了避免递归.

 @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);
        }
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上我创建的这个要点做得更好:https://gist.github.com/3405429 (8认同)
  • 请使用`getChildFragmentManger()`这是更好的解决方案 (7认同)

Les*_*zek 38

Jords,我想你可以用FragmentStatePagerAdapter而不是FragmentPageAdapter.它会为你删除碎片.

PS.很抱歉使用答案而不是评论,但我的声誉太低了.


Ste*_*yle 26

我刚遇到同样的问题.我有Fragment一个需要举办ViewPagerFragments.当我把另一个堆叠在我的Fragment上面ViewPagerFragment然后回击时,我会得到一个IllegalStateException.检查日志(堆叠新时后Fragment),我发现我ViewPagerFragment会去通过其生命周期的方法来阻止和破坏,但其子女Fragments在该ViewPager会留在onResume.我意识到,孩子Fragments应该由被管理FragmentManagerViewPagerFragment,不是FragmentManagerActivity.

我当时理解,上面的答案是为了解决Fragments不能生孩子的局限Fragments.但是,现在最新的支持库已经支持Fragment嵌套,您不再需要为自己设置适配器ViewPager,并且getChildFragmentManager()只需要传递即可.到目前为止,这对我来说一直很好.

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

    mAdapter = new ViewPagerAdapter(getChildFragmentManager());
    mViewPager.setAdapter(mAdapter);

    return mView;
}
Run Code Online (Sandbox Code Playgroud)


ina*_*ruk 19

我曾经Handler.post()在原始片段事务之外设置适配器:

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    mHandler.post(new Runnable() {
        @Override
        public void run() {
            mViewPager.setAdapter(mAdapter);     
        }
    });        
}
Run Code Online (Sandbox Code Playgroud)

  • 这种方法是否会导致碎片之间切换的任何问题?我现在遇到一个问题,如果我去另一个Fragment然后再回到包含ViewPager的那个片段.它没有显示内容,也没有正确滚动. (2认同)