ViewPager внутри фрагмента исчезает после transaction.remove () (Ведение экземпляра?)

Я использую Google API 8 (Android 2.2) с пакетами v4.

Привет, вот моя проблема:

У меня есть FragmentActivity, у которого есть меню, которое всегда остается на экране и немного контейнера (FrameLayout), где я помещаю много фрагментов. Мое приложение отлично работает, когда я скрываю и показываю фрагменты, но он падает после загрузки всех фрагментов, потому что у меня ограниченная память. В этом случае мне пришлось удалить некоторые фрагменты при загрузке других, чтобы приложение не разбилось. Но здесь возникает еще одна проблема: мои пейджеры не перезагружаются после того, как я их удаляю, все остальные фрагменты работают нормально. Только мои пейджеры не показывают, они не падают, просто исчезают. Вот несколько кодов, чтобы дать вам понять, о чем моя проблема:

MyFragmentActivity.java имеет этот макет:

<LinearLayout ...(some code from menu that doesn't matter) <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" > </FrameLayout> </LinearLayout> 

В этом FrameLayout я поместил все свои фрагменты. Фрагменты пейджеров – один из них, и его расположение выглядит так:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <android.support.v4.view.ViewPager android:id="@+android:id/some_pager" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> 

И я реализовал этот абстрактный класс AbstractPagerFragment :

 import java.util.List; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public abstract class AbstractPagerFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View fragment = inflater.inflate(getLayoutID(), container,false); PagerAdapter mPagerAdapter = initializePager(); ViewPager pager = (ViewPager) fragment.findViewById(getPagerID()); pager.setAdapter(mPagerAdapter); return fragment; } private PagerAdapter initializePager() { PagerAdapter mPagerAdapter = new templateDigital.util.PagerAdapter(getFragmentManager(), getFragments()); return mPagerAdapter; } public abstract List<Fragment> getFragments(); public abstract int getLayoutID(); public abstract int getPagerID(); } 

Это использует мой PagerAdapter, который выглядит так:

 import java.util.List; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; public class PagerAdapter extends FragmentPagerAdapter{ private List<Fragment> fragments; public PagerAdapter(FragmentManager fManager, List<Fragment> fragments) { super(fManager); this.fragments = fragments; } @Override public Fragment getItem(int position) { return fragments.get(position); } @Override public int getCount() { return fragments.size(); } @Override public int getItemPosition(Object object) { return POSITION_NONE; } } 

Теперь давайте реализуем мой AbstractPagerFragment :

 import templateDigital.main.R; import templateDigital.util.fragments.AbstractPagerFragment; import templateDigital.util.fragments.GenericFragment; import android.support.v4.app.Fragment; public class ConcretePagerFragment extends AbstractPagerFragment { private List<Fragment> fragments; public ConcretePagerFragment() { fragments = new ArrayList<Fragment>(); fragments.add(new GenericFragment(R.layout.concept_page1_fragment)); fragments.add(new GenericFragment(R.layout.concept_page2_fragment)); fragments.add(new GenericFragment(R.layout.concept_page3_fragment)); //GenericFragments is a class that extends Fragments and just inflate a layout with a background image. } @Override public List<Fragment> getFragments() { return fragments; } @Override public int getLayoutID() { return R.layout.pager_fragment; } @Override public int getPagerID() { return R.id.some_pager; // the pager inside the layout } } 

Хорошо, теперь я добавляю его из своего контента (FrameLayout), как это (myFragment – это PagerFragment, а myTag – это строка, которая представляет свой тег, определенный мной):

 FragmentTransaction transaction = fragmentManager.beginTransaction(); if (fragmentManager.findFragmentByTag(myTag) == null) { transaction.add(R.id.content,myFragment, myTag); } transaction.setCustomAnimations(R.anim.fade_in, R.anim.fade_out); hideAllOtherFragments(myTag, transaction); //Here I hide all other fragments, the code is okay. Trust me. transaction.show(myFragment()); transaction.commit(); 

И вот как я его удаляю:

 ... transaction.remove(myFragment); ... 

Но когда он снова загрузится после перехода к фрагменту в меню, используя тот же метод, который я использовал в первый раз (код выше), пейджер больше не отображается. Может ли кто-нибудь разрешить это?

Если вы прочтете все это, спасибо, вы чемпион.

    На самом деле, если вы хотите реализовать ViewPager с фрагментами, вы должны добавить TabHost, TabWidget FrameLayout и ViewPager.

    TabHost будет контейнером для окна с вкладками. Этот объект содержит двоих детей: набор ярлыков вкладок, которые пользователь нажимает, чтобы выбрать конкретную вкладку, а FrameLayout – это объект, который отображает содержимое этой страницы. И после того, как вам нужно создать TabAdapter (что-то вроде вашего PagerAdapter) и добавить фрагменты для каждой вкладки, вызвав mTabsAdapter.addTab и отправив фрагмент в качестве параметра

    Я сделал сообщение об этом , где объясню, как интегрировать фрагменты и ViewPager. Надеюсь, поможет.