Intereting Posts
Получать оповещение Android Push, даже если приложение закрыто Как я могу создать пользовательский диалог с двумя datepicker? Facebook SDK 3.0 – как заставить AUTH диалог? WebView не работает, запуская URL-адрес извне в браузере. Отображение веб-страницы внутри приложения Как обрабатывать обратные вызовы URL-адресов OAuth с помощью фильтров Intent, если проверка подлинности выполняется с помощью webview? Как прокрутить экран вниз в тесте espresso для андроида? Мне нужно проверить текст, присутствующий на экране Затухание текущей активности Как удалить фокус из EditText, когда пользователь закончил редактирование? Python для IOS или Android Цвет RippleDrawable mask, для чего он нужен? Кордоба добавить платформу – Ошибка выполнения команды 'ant' AsyncTask или Handler – какой из них лучше для трудоемкого сетевого взаимодействия и обработки? Класс PagerAdapter, вызываемый несколько раз Как сделать снимок экрана в эмуляторе Android Android: расширение контактной книги пользователя. Производительность ContentProvider vs Sqlite vs Список в памяти

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. Надеюсь, поможет.