抛出:IllegalArgumentException:没有查看发现ID为片段--- ViewPager在ViewPager抛出、片段、发现、ViewPager

2023-09-05 04:23:48 作者:相关萌系推荐>>

我遇到的问题是麻烦我好几天。

有一个 ViewPager ,其中包含3 片段译文]选项卡碎片的主要活动。在首先片段有一个的ListView 持有的一些看法,而这是最重要的,另一个 ViewPager 。我想持有子 ViewPager 一些照片,并在这里用一些片段。

现在有麻烦: 当第一 片段停止(第三片段父 ViewPager 被认为是在屏幕上)和恢复(用户切换到第二片段),应用程序崩溃和调试器说:

  java.lang.IllegalArgumentException:如果没有查看发现ID 0x7f05008b(com.example.viewpager:ID / sub_viewpager)的片段ScreenSlidePageFragment
 

我已经使用 getChildFragmentManager(),因为这是对的嵌套片段的。

阅读Spring源码 IOC控制反转前的处理

下面是列表适配器的关键code对应于父ViewPager第一个片段:

  @覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){
    整型= getItemViewType(位置);
    开关(类型){
        案例TYPE_BANNER:
            如果(convertView == NULL){
                convertView = mBannerView.getBannerView(父);
            }
            mBannerView.update(convertView);
            打破;
        案例TYPE_ITEM:
            打破;
    }
    返回convertView;
}
 

这里是code mBannerView

 公共类BannerView {

    私有静态最后DisplayImageOptions IMAGE_OPTIONS_SCALE_STRETCHED =
            新DisplayImageOptions.Builder()
                    .cacheInMemory()
                    .cacheOnDisc()
                    .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
                    。建立();

    私人FragmentActivity mActivity;
    私人片段mFragment;
    私人列表<横幅> mBanners;
    私人ScreenSlidePagerAdapter mPagerAdapter;
    私人ViewPager mViewPager;

    公共BannerView(FragmentActivity活动,片段片段){
        mActivity =活动;
        mFragment =片段;
    }

    公共无效更新(查看convertView){
        mViewPager =(ViewPager)convertView;
        如果(mBanners =空&安培;!&安培;!mBanners.isEmpty()){
            如果(mPagerAdapter == NULL){
                mPagerAdapter =新ScreenSlidePagerAdapter(mFragment.getChildFragmentManager());
                mViewPager.setAdapter(mPagerAdapter);
            }
        }
        mViewPager.setOnClickListener(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                如果(mOnBannerClickListener!= NULL){
                    mOnBannerClickListener.onBannerClick();
                }
            }
        });
    }

    类ScreenSlidePagerAdapter扩展FragmentStatePagerAdapter {
        公共ScreenSlidePagerAdapter(FragmentManager FM){
            超(FM);
        }

        @覆盖
        公共片段的getItem(INT位置){
            返回新ScreenSlidePageFragment(mBanners.get(位置).getImageUrl());
        }

        @覆盖
        公众诠释getCount将(){
            返回mBanners == NULL? 0:mBanners.size();
        }
    }

    类ScreenSlidePageFragment扩展片段{

        私人字符串mUrl;

        ScreenSlidePageFragment(字符串URL){
            超();
            mUrl =网址;
        }

        @覆盖
        公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
                                 捆绑savedInstanceState){
            查看查看= inflater.inflate(R.layout.item_banner,集装箱,假);
            如果(查看!= NULL){
                ImageView的ImageView的=(ImageView的)view.findViewById(R.id.item_banner_image);
                imageView.setLayoutParams(新LinearLayout.LayoutParams(
                        LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT));
                。ImageLoader.getInstance()displayImage(mUrl,ImageView的,IMAGE_OPTIONS_SCALE_STRETCHED);
            }
            返回查看;
        }
    }
}
 

下面是详细的错误清单:

  11-10 18:12:19.217 1444年至1444年/? E / MessageQueue-JNI:java.lang.IllegalArgumentException:如果没有查看发现ID 0x7f05008b(com.example.viewpager:ID / sub_viewpager)的片段ScreenSlidePageFragment {428d8ea0#0 ID = 0x7f05008b}
        在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:919)
        在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
        在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086)
        在android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1884)
        在android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1514)
        在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947)
        在android.support.v4.app.FragmentManagerImpl.attachFragment(FragmentManager.java:1280)
        在android.support.v4.app.BackStackRecord.run(BackStackRecord.java:672)
        在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
        在android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
        在android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
        在android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
        在android.support.v4.view.ViewPager.populate(ViewPager.java:914)
        在android.support.v4.view.ViewPager $ 3.run(ViewPager.java:244)
        在android.support.v4.view.ViewPager.completeScroll(ViewPager.java:1761)
        在android.support.v4.view.ViewPager.onInterceptTouchEvent(ViewPager.java:1896)
        在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1854)
        在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
        在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1912)
        在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
        在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1912)
        在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
        在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1912)
        在com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2228)
        在com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1471)
        在android.app.Activity.dispatchTouchEvent(Activity.java:2424)
        在com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchTouchEvent(PhoneWindow.java:2176)
        在android.view.View.dispatchPointerEvent(View.java:7571)
        在android.view.ViewRootImpl $ ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3883)
        在android.view.ViewRootImpl $ ViewPostImeInputStage.onProcess(ViewRootImpl.java:3778)
        在android.view.ViewRootImpl $ InputStage.deliver(ViewRootImpl.java:3379)
        在android.view.ViewRootImpl $ InputStage.onDeliverToNext(ViewRootImpl.java:3429)
        在android.view.ViewRootImpl $ InputStage.forward(ViewRootImpl.java:3398)
        在android.view.ViewRootImpl $ AsyncInputStage.forward(ViewRootImpl.java:3483)
        在android.view.ViewRootImpl $ InputStage.apply(ViewRootImpl.java:3406)
        在android.view.ViewRootImpl $ AsyncInputStage.apply(ViewRootImpl.java:3540)
        在android.view.ViewRootImpl $ InputStage.deliver(ViewRootImpl.java:3379)
        在android.view.ViewRootImpl $ InputStage.onDeliverToNext(ViewRootImpl.java:3429)
        在android.view.ViewRootImpl $ InputStage.forward(ViewRootImpl.java:3398)
        在android.view.ViewRootImpl $ InputStage.apply(ViewRootImpl.java:3406)
        在android.view.ViewRootImpl $ InputStage.deliver(ViewRootImpl.java:3379)
        在android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5419)
        在android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5399)
        在android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5370)
        在android.view.ViewRootImpl $ WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5493)
        在android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:182)
        在android.os.MessageQueue.nativePollOnce(本机方法)
        在android.os.MessageQueue.next(MessageQueue.java:132)
        在android.os.Looper.loop(Looper.java:124)
        在android.app.ActivityThread.main(ActivityThread.java:5289)
        在java.lang中
 

解决方案

更​​新:

我读过的FragmentManager源$ C ​​$ C终于得到了真正的原因是:当碎片要连接到viewpager的viewpager连接到其父在此之前的异常情况。换句话说,所述getView()方法返回之前,所述片段被充气。然后ViewPager的容器findViewById()方法被调用,但ViewPager处于分离状态下呢,所以空被发现,则抛出。

解决方案是创建一个自定义ViewPager和懒惰一套适配器:

 公共类BannerViewPager扩展ViewPager {
    PagerAdapter mPagerAdapter;

    @覆盖
    保护无效onAttachedToWindow(){
        super.onAttachedToWindow();
        如果(mPagerAdapter!= NULL){
            super.setAdapter(mPagerAdapter);
            mPageIndicator.setViewPager(本);
        }
    }

    @覆盖
    公共无效setAdapter(PagerAdapter适配器){
    }

    公共无效storeAdapter(PagerAdapter pagerAdapter){
        mPagerAdapter = pagerAdapter;
    }

    公共BannerViewPager(上下文的背景下){
        超(上下文);
    }

    公共BannerViewPager(上下文的背景下,ATTRS的AttributeSet){
        超(背景下,ATTRS);
    }

}
 

而不是setAdapter而在getView()方法中,使用storeAdapter()。

下面的语句是不正确的。上面的字是实际的原因。

最后,我已经得到了答案。它由两部分组成。

在父ViewPager我用了一个 FragmentPagerAdapter 持有片段,但现在我用的是 FragmentStatePagerAdapter 代替。这两者之间的差异可以在这里找到:FragmentPagerAdapter和FragmentStatePagerAdapter 之间差异。 简单地说,FragmentPagerAdapter将存储更多的信息,当一个片段被停止。在这种情况下,在父ViewPager第一片段被停止,但不被破坏,而在该片段的观点被破坏。恢复后,该片段尝试重新膨胀各方面的意见。但 getView()方法被调用和子ViewPager被重建之前,FragmentManager试图找到子ViewPager孩子持有这些previously存储碎片。因此,java.lang.IllegalArgumentException:如果没有查看发现号出现

在我取代了FragmentPagerAdapter与FragmentStatePagerAdapter,出现了另一个问题。当父片段(父viewpager的第一个片段)停止,破坏和恢复的子viewpager缺失。这发生在第一个片段choosen,不久之后第三个片段choosen,并在最后的第一个片段重新choosen。 我认为这是Android SDK中的一个bug。通过这里和here,我用了一些棘手的方法来解决这个问题。关键是,当父片段被破坏,字段成员--- mChildFragmentManager结束了一个破碎的内部状态,并没有完全清除。当父片段重建,mChildFragmentManager不为空,但父片段被毁坏后,这是managered由mChildFragmentManager子片段已被破坏。因此,子ViewPager显示在屏幕上,这是为了响应假的片段,这实际上是不存在的空视图。有趣的是,右刷卡上分ViewPager几次后,子片段和意见再次出现。

下面是codeS:

父适配器:

  @覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){
    如果(convertView == NULL){
        convertView = getBannerView(mParent);
    }
    mViewPager =(ViewPager)convertView;
    如果(mBanners =空&安培;!&安培;!mBanners.isEmpty()){
        如果(mPagerAdapter == NULL){
            FragmentManager childFM = mFragment.getChildFragmentManager();
            removeOldFragment(childFM);
            mPagerAdapter =新ScreenSlidePagerAdapter(childFM,mBanners);
            mViewPager.setAdapter(mPagerAdapter);
        }
    }
    返回convertView;
}
 

关键的方法:

 私人无效removeOldFragment(FragmentManager FM){
        尝试 {
            现场加= fm.getClass()getDeclaredField(mAdded)。
            added.setAccessible(真正的);
            added.set(FM,NULL);
        }赶上(NoSuchFieldException E){
            抛出新的RuntimeException(E);
        }赶上(IllegalAccessException E){
            抛出新的RuntimeException(E);
        }
        尝试 {
            场上主动= fm.getClass()getDeclaredField(mActive)。
            active.setAccessible(真正的);
            active.set(FM,NULL);
        }赶上(NoSuchFieldException E){
            抛出新的RuntimeException(E);
        }赶上(IllegalAccessException E){
            抛出新的RuntimeException(E);
        }
    }
 

I've met the problem that trouble me for days.

There is a ViewPager in the main activity which holds 3 Fragments as tab fragments. In the first fragment there is a ListView which holds some views, and which is the most important, another ViewPager. I want to hold some photos in the sub ViewPager, and use some more fragments here.

Now there is the trouble: When the first Fragment is stopped (The third fragment in the parent ViewPager is seen on screen) and resumed (the user switch to the second fragment), the app crashes and the debugger says:

java.lang.IllegalArgumentException: No view found for id 0x7f05008b (com.example.viewpager:id/sub_viewpager) for fragment ScreenSlidePageFragment

I've already use the getChildFragmentManager() as this is a situation of nested fragments.

Here is the key code of list adapter corresponding to the first fragment in the parent ViewPager:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    int type = getItemViewType(position);
    switch (type) {
        case TYPE_BANNER:
            if (convertView == null) {
                convertView = mBannerView.getBannerView(parent);
            }
            mBannerView.update(convertView);
            break;
        case TYPE_ITEM:
            break;
    }
    return convertView;
}

Here is the code of mBannerView:

public class BannerView {

    private static final DisplayImageOptions IMAGE_OPTIONS_SCALE_STRETCHED =
            new DisplayImageOptions.Builder()
                    .cacheInMemory()
                    .cacheOnDisc()
                    .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
                    .build();

    private FragmentActivity mActivity;
    private Fragment mFragment;
    private List<Banner> mBanners;
    private ScreenSlidePagerAdapter mPagerAdapter;
    private ViewPager mViewPager;

    public BannerView(FragmentActivity activity, Fragment fragment) {
        mActivity = activity;
        mFragment = fragment;
    }

    public void update(View convertView) {
        mViewPager = (ViewPager) convertView;
        if (mBanners != null && !mBanners.isEmpty()) {
            if (mPagerAdapter == null) {
                mPagerAdapter = new ScreenSlidePagerAdapter(mFragment.getChildFragmentManager());
                mViewPager.setAdapter(mPagerAdapter);
            }
        }
        mViewPager.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mOnBannerClickListener != null) {
                    mOnBannerClickListener.onBannerClick();
                }
            }
        });
    }

    class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return new ScreenSlidePageFragment(mBanners.get(position).getImageUrl());
        }

        @Override
        public int getCount() {
            return mBanners == null ? 0 : mBanners.size();
        }
    }

    class ScreenSlidePageFragment extends Fragment {

        private String mUrl;

        ScreenSlidePageFragment(String url) {
            super();
            mUrl = url;
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.item_banner, container, false);
            if (view != null) {
                ImageView imageView = (ImageView) view.findViewById(R.id.item_banner_image);
                imageView.setLayoutParams(new LinearLayout.LayoutParams(
                        LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
                ImageLoader.getInstance().displayImage(mUrl, imageView, IMAGE_OPTIONS_SCALE_STRETCHED);
            }
            return view;
        }
    }
}

Here is the detailed error list:

11-10 18:12:19.217    1444-1444/? E/MessageQueue-JNI﹕ java.lang.IllegalArgumentException: No view found for id 0x7f05008b (com.example.viewpager:id/sub_viewpager) for fragment ScreenSlidePageFragment{428d8ea0 #0 id=0x7f05008b}
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:919)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086)
        at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1884)
        at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1514)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947)
        at android.support.v4.app.FragmentManagerImpl.attachFragment(FragmentManager.java:1280)
        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:672)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
        at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
        at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
        at android.support.v4.view.ViewPager$3.run(ViewPager.java:244)
        at android.support.v4.view.ViewPager.completeScroll(ViewPager.java:1761)
        at android.support.v4.view.ViewPager.onInterceptTouchEvent(ViewPager.java:1896)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1854)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1912)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1912)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1912)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2228)
        at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1471)
        at android.app.Activity.dispatchTouchEvent(Activity.java:2424)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2176)
        at android.view.View.dispatchPointerEvent(View.java:7571)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3883)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3778)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3483)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3540)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5419)
        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5399)
        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5370)
        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5493)
        at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:182)
        at android.os.MessageQueue.nativePollOnce(Native Method)
        at android.os.MessageQueue.next(MessageQueue.java:132)
        at android.os.Looper.loop(Looper.java:124)
        at android.app.ActivityThread.main(ActivityThread.java:5289)
        at java.lang

解决方案

Update:

I've read the source code of the FragmentManager and finally got the true reason: This exception happens when the fragments want to be attached to the viewpager before the viewpager is attached to its parent. In other words, before the getView() method returns, the fragments are inflated. Then the findViewById() method of the container of the ViewPager is called but the ViewPager is in detached state yet, so null is found and the IllegalArgumentException is thrown.

The solution is to create a custom ViewPager and lazy set the adapter:

public class BannerViewPager extends ViewPager {
    PagerAdapter mPagerAdapter;

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        if (mPagerAdapter != null) {
            super.setAdapter(mPagerAdapter);
            mPageIndicator.setViewPager(this);
        }
    }

    @Override
    public void setAdapter(PagerAdapter adapter) {
    }

    public void storeAdapter(PagerAdapter pagerAdapter) {
        mPagerAdapter = pagerAdapter;
    }

    public BannerViewPager(Context context) {
        super(context);
    }

    public BannerViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

}

And in the getView() method, use storeAdapter() instead of setAdapter.

The following statements are not correct. The words above are the actual reason.

Finally I've got the answer. It consists of two parts.

In the parent ViewPager I used a FragmentPagerAdapter to hold fragments, but now I use a FragmentStatePagerAdapter instead. The difference between these two can be found here: Difference between FragmentPagerAdapter and FragmentStatePagerAdapter. Simply speaking, FragmentPagerAdapter will store more information when a fragment is stopped. In this situation, the first fragment in the parent ViewPager is stopped but not destroyed while the views in this fragment are destroyed. After resumed, the fragment try to re-inflate all the views. But before the getView() method is called and the sub-ViewPager is recreated, the child FragmentManager tries to find the sub-ViewPager to hold those previously stored fragments. Thus the "java.lang.IllegalArgumentException: No view found for id" occurs.

After I replaced the FragmentPagerAdapter with FragmentStatePagerAdapter, another problem appears. the sub-viewpager is missing when the parent fragment (the first fragment in the parent viewpager) was stopped, destroyed and resumed. This happens when the first fragment is choosen, soon afterwards the third fragment is choosen, and at last the first fragment is re-choosen. I think this is a bug of android sdk. Inspired by here and here, I use some tricky methods to solve the problem. The point is, when a parent fragment is destroyed, the field member --- mChildFragmentManager "ends up with a broken internal state" and is not totally cleaned up. When the parent fragment is recreated, mChildFragmentManager is not null, but the sub fragments is already been destroyed after the parent fragment being destroyed, which was managered by mChildFragmentManager. Thus the sub ViewPager displays an empty view on the screen, which responds to a fake fragment which is actually not existing. The funny thing is, after swiping right on the sub ViewPager for several times, the sub fragments and the views appear again.

Here is the codes:

Parent Adapter:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = getBannerView(mParent);
    }
    mViewPager = (ViewPager) convertView;
    if (mBanners != null && !mBanners.isEmpty()) {
        if (mPagerAdapter == null) {
            FragmentManager childFM = mFragment.getChildFragmentManager();
            removeOldFragment(childFM);
            mPagerAdapter = new ScreenSlidePagerAdapter(childFM, mBanners);
            mViewPager.setAdapter(mPagerAdapter);
        }
    }
    return convertView;
}

The key method:

    private void removeOldFragment(FragmentManager fm) {
        try {
            Field added = fm.getClass().getDeclaredField("mAdded");
            added.setAccessible(true);
            added.set(fm, null);
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
        try {
            Field active = fm.getClass().getDeclaredField("mActive");
            active.setAccessible(true);
            active.set(fm, null);
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }