【问题标题】:ViewPager inside Fragment loses content when returning to itFragment 中的 ViewPager 返回时会丢失内容
【发布时间】:2013-09-09 12:46:34
【问题描述】:

我正在使用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 加载成功并且 welcomeFragment 中的 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

)

【问题讨论】:

  • 那么您找到解决方案了吗?

标签: android android-fragments android-viewpager android-tabhost viewpagerindicator


【解决方案1】:

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

getChildFragmentManager()

【讨论】:

  • 请接受这个答案
  • 看来这是最好的答案
【解决方案2】:

试试这个:

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

使用这句话 (pager.setOffscreenPageLimit),您可以指定标签在被 ViewPager 擦除之前可以站立多远!

干杯!

【讨论】:

    【解决方案3】:

    使用 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()。

    【讨论】:

    • 在 onCreateView() 方法中设置适配器。你是在 onActivityCreated() 中做的,它只被调用一次。
    • 另外,您需要使用 getChildFragmentManager()。我更新了我的答案。
    • 根据您的建议,当我从第二个选项卡返回到第一个选项卡时,我现在使用 childFragmentManager()...应用程序崩溃...。上面也给出了错误日志
    • 我没有看到你的错误信息。您能否粘贴您的片段的当前代码和错误日志。 pastebin.com
    • @PhilippJahoda.. 它不工作。如果我第一次单击该选项卡,它的加载正常,但如果我切换回其他选项卡并返回,则应用程序将因IllegalStateException : No Activity 而崩溃
    猜你喜欢
    • 1970-01-01
    • 2014-01-08
    • 2017-03-05
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多