Я использую ViewPager с 4 страницами, и я ищу эффективный способ замены/переключения между фрагментами на каждой странице.Заменить фрагмент в ViewPager с помощью FragmentPagerAdapter
Это модель взаимодействия, которые я пытаюсь создать:
- Пользователь нажимает кнопку на странице, которая в настоящее время занимает фрагмент
- Фрагмент А выгружена для некоторого нового фрагмента B
- пользователь делает некоторую работу в фрагменте B, а затем нажимает кнопку, когда он/она делается
- фрагмент B удаляется и заменяется фрагментом а (исходный фрагмент)
Я нашел способ сделать это, но он, похоже, имеет значительные недостатки. Решение включает в себя удаление исходного фрагмента, а затем переопределение getItemPosition
(по существу, способ, описанный в этом related question):
//An array to keep track of the currently visible fragment in each page
private final Fragment[] activeFragments= new Fragment[4];
public void openFragmentB(ViewPager pager, int position) {
startUpdate(pager);
//Remove the original fragment
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.remove(activeFragments[position]);
transaction.commit();
//Create a new tile search fragment to replace the original fragment
activeFragments[position] = FragmentB.newInstance();
pageStates[position] = PageState.STATE_B;
finishUpdate(pager);
notifyDataSetChanged();
}
@Override
public int getItemPosition(Object object) {
//If the main fragment is not active, return POSITION_NONE
if(object instanceof FragmentA) {
FragmentA a = (FragmentA) object;
if(pageStates[a.getPosition()] != PageState.STATE_A) {
return POSITION_NONE;
}
}
//If the secondary fragment is not active, return POSITION_NONE
if(object instanceof FragmentB) {
FragmentB b = (FragmentB) object;
if(pageStates[b.getPosition()] != PageState.STATE_B) {
return POSITION_NONE;
}
}
return POSITION_UNCHANGED;
}
Этот метод работает, но имеет нежелательные побочные эффекты. Удаление фрагмента и установка его позиции на POSITION_NONE приводит к уничтожению фрагмента. Поэтому, когда пользователь заканчивает использование FragmentB, мне нужно будет создать новый экземпляр FragmentA вместо повторного использования исходного фрагмента. Основные фрагменты пейджера (FragmentA в этом примере) будут содержать относительно большие резервные копии базы данных, поэтому я хочу избежать их воссоздания, если это возможно.
По сути, я просто хочу сохранить ссылки на мои 4 основных фрагмента и поменять их на и из страниц, не создавая их каждый раз. Есть идеи?
«Фрагменты» также являются «Представлениями», вы можете создать макет с помощью «Фрагментов», которые вам нужно поменять местами, а затем просто используйте 'setVisibility()' для их удаления и добавления. – adneal