ViewPager внутри Fragment теряет содержимое при возврате к нему

Я реализую tabhost, используя FragmentActivity , на первой вкладке я загружаю фрагмент приветствия, который содержит Viewpager и CirclePageIndIcator, мне нужно загрузить 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 работает нормально, но когда я перехожу на 2-ю вкладку и снова возвращаюсь на 1-ю вкладку, 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

)


comment
Так ты когда-нибудь находил решение?   -  person Sheharyar    schedule 14.11.2013


Ответы (3)


если вы используете ViewPager в Fragment, при создании нового адаптера вы должны использовать ChildFragmentManager:

getChildFragmentManager()
person savepopulation    schedule 20.01.2015
comment
Примите это как ответ, пожалуйста - person gorodechnyj; 07.08.2018
comment
кажется, это лучший ответ - person masoudmjm; 28.01.2020

Попробуй это:

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

с помощью этого предложения (pager.setOffscreenPageLimit) вы можете указать, как далеко может стоять вкладка, прежде чем она будет стерта ViewPager!

Ваше здоровье!

person Sebastian Corradi    schedule 03.06.2014

Используйте 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().

person Philipp Jahoda    schedule 09.09.2013
comment
Установите адаптер в методе onCreateView(). Вы делаете это в onActivityCreated(), который вызывается только один раз. - person Philipp Jahoda; 09.09.2013
comment
Кроме того, вам нужно использовать getChildFragmentManager(). Я обновил свой ответ. - person Philipp Jahoda; 09.09.2013
comment
по вашему предложению я использую childFragmentManager() теперь, когда я возвращаюсь со 2-й вкладки на 1-ю вкладку... приложение разбилось.... и журнал ошибок также указан выше - person ranjith; 09.09.2013
comment
Я не вижу вашего сообщения об ошибке. Не могли бы вы вставить текущий код вашего фрагмента и журнал ошибок. pastebin.com - person Philipp Jahoda; 09.09.2013
comment
@ user1672337 ты решил эту проблему? Я с той же проблемой - person null pointer; 16.10.2013
comment
да... это правильно для вложенного фрагмента, нужно использовать новый экземпляр и getChildFragmentManager - person Shawn Thye; 17.11.2013
comment
@PhilippJahoda.. Это не работает. Если я нажму на вкладку в первый раз, она загрузится нормально, но если я вернусь на другую вкладку и вернусь, приложение вылетает с ошибкой IllegalStateException : No Activity - person Bharath; 02.12.2013