当返回到包含ViewPager的Fragment时,ViewPager丢失了其内容

9

我正在使用FragmentActivity实现tabhost,在第一个选项卡中加载欢迎片段,该片段包含一个ViewpagerCirclePageIndicator。我需要在WelcomeFragment中加载4个视图。

这是我的WelcomeFragment:

public class WelcomeFragment extends Fragment
{
     PageAdapter mAdapter;
        ViewPager mPager;
        CirclePageIndicator mIndicator;
        List<Fragment> fragments;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.frag_welcome_layout,null);
        mPager=(ViewPager)view.findViewById(R.id.myViewPager);
        mIndicator=(CirclePageIndicator)view.findViewById(R.id.circlePageIndicator1);
        fragments=new ArrayList<Fragment>();
        return view;
    }
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Fragment fragment;
        for(int i=0;i<4;i++)
        {
            fragment= Fragment.instantiate(getActivity(), TipsFragment.class.getName());
            fragments.add(fragment);
        }
            mAdapter = new PageAdapter(getFragmentManager(),fragments);
            mPager.setAdapter(mAdapter);
        mIndicator.setViewPager(mPager);
    }
}

这是我的页面适配器

public class PageAdapter extends FragmentPagerAdapter implements Serializable{

    List<Fragment> fragments;
    public PageAdapter(FragmentManager fm,List<Fragment> frags) {
        super(fm);
        fragments = frags;

    }

    @Override
    public Fragment getItem(int arg0) {
        // TODO Auto-generated method stub
        return TipsFragment.newInstance(0, 0);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 4;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        FragmentManager manager = ((Fragment) object).getFragmentManager();
        FragmentTransaction trans = manager.beginTransaction();
        trans.remove((Fragment) object);
        trans.commit();

        super.destroyItem(container, position, object);
    }

}

当我第一次加载应用程序时,tabFragmentActivity成功加载,并且欢迎片段中的viewpager正常工作,但是当我移动到第二个选项卡并再次返回到第一个选项卡时,ViewPager不能成功加载。
我该怎么解决它?
根据建议,我使用了getChildFragmentManager,但应用程序崩溃了,logcat中出现错误。
09-09 13:28:39.412: E/AndroidRuntime(3100): FATAL EXCEPTION: main
09-09 13:28:39.412: E/AndroidRuntime(3100): java.lang.IllegalStateException: No activity
09-09 13:28:39.412: E/AndroidRuntime(3100):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1091)
09-09 13:28:39.412: E/AndroidRuntime(3100):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086)
09-09 13:28:39.412: E/AndroidRuntime(3100):     at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1877)
09-09 13:28:39.412: E/AndroidRuntime(3100):     at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1492)
09-09 13:28:39.412: E/AndroidRuntime(3100):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947)
09-09 13:28:39.412: E/AndroidRuntime(3100):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
09-09 13:28:39.412: E/AndroidRuntime(3100):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
09-09 13:28:39.412: E/AndroidRuntime(3100):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460)
09-09 13:28:39.412: E/AndroidRuntime(3100):     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
09-09 13:28:39.412: E/AndroidRuntime(3100):     at android.os.Handler.handleCallback(Handler.java:725)
09-09 13:28:39.412: E/AndroidRuntime(3100):     at android.os.Handler.dispatchMessage(Handler.java:92)
09-09 13:28:39.412: E/AndroidRuntime(3100):     at android.os.Looper.loop(Looper.java:137)
09-09 13:28:39.412: E/AndroidRuntime(3100):     at android.app.ActivityThread.main(ActivityThread.java:5041)
09-09 13:28:39.412: E/AndroidRuntime(3100):     at java.lang.reflect.Method.invokeNative(Native Method)
09-09 13:28:39.412: E/AndroidRuntime(3100):     at java.lang.reflect.Method.invoke(Method.java:511)
09-09 13:28:39.412: E/AndroidRuntime(3100):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
09-09 13:28:39.412: E/AndroidRuntime(3100):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
09-09 13:28:39.412: E/AndroidRuntime(3100):     at dalvik.system.NativeStart.main(Native Method

)


那么,你找到解决方案了吗? - Sheharyar
3个回答

14

如果您在Fragment中使用ViewPager,当您创建新适配器时,应该使用ChildFragmentManager

getChildFragmentManager()

请接受这个答案。 - gorodechnyj
似乎这是最佳答案。 - masoud jafari

4

试试这个:

    ViewPager pager = [your viewPAger]
    pager.setOffscreenPageLimit([quantity of tabs that you are going to use]);

使用pager.setOffscreenPageLimit可以指定在ViewPager中,标签可以在被删除之前离当前位置有多远。

干杯!


2

使用 AsyncTask 来设置 ViewPagerAdapter:

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

        @Override
        protected void onPostExecute(Void result) {

            if(mPagerAdapter != null) mViewPager.setAdapter(mPagerAdapter);
        }
    }   

这样调用:

mAdapter = new PageAdapter(getChildFragmentManager(), fragments);
new SetAdapterTask().execute();

不要调用:

mViewPager.setAdapter(mPagerAdapter);

onCreateView(...)方法内部设置适配器,而不是在onActivityCreated(...)方法内部。

此外,使用getChildFragmentManager()而不是getFragmentManager()。


1
根据您的建议,我现在使用childFragmentManager()。但是当我从第二个标签返回到第一个标签时,应用程序崩溃了...错误日志也已经给出。 - ranjith
我看不到你的错误信息。你能把你的代码片段和错误日志放在pastebin上吗?http://pastebin.com/ - Philipp Jahoda
@user1672337,你解决了这个问题吗?我也遇到了同样的问题。 - null pointer
验证嵌套片段是否正确,需要使用新实例和getChildFragmentManager。 - Shawn Thye
1
@PhilippJahoda.. 这个不行。如果我第一次点击选项卡,它可以正常加载,但是如果我切换到其他选项卡并返回,则应用程序会崩溃,并显示“非法状态异常:没有活动”。 - Bharath
显示剩余2条评论

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