Я использую ViewPager вместе с FragmentPagerAdapter для размещения трех разных фрагментов.
[Fragment1][Fragment2][Fragment3]
Чего я пытаюсь добиться, так это успешно заменить Fragment1 совершенно новым фрагментом Fragment4, если конкретная задача будет выполнена успешно.
Когда я использую..
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.fragment1_layout_id, fragment4);
transaction.commit();
..фрагмент красиво заменяется и показывает Fragment4 вместо Fragment1. Хотя, как только я прокручиваю до Fragment3, а затем обратно до Fragment4, Fragment1 возвращается.
Опять же, если я использую ..
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.remove(fragment1);
transaction.commit();
..Fragment1 удаляется, и когда я возвращаюсь, Fragment4 там. Итак, проблема с этим решением заключается в том, что я не смог найти способ немедленно показать Fragment4, поскольку Fragment1 удален, даже если бы я попытался:
transaction.add(fragment4);
transaction.show(fragment4);
А вот как моя реализация FragmentPagerAdapter выглядит на данный момент без управления транзакциями:
public static class PagerAdapter extends FragmentPagerAdapter {
public PagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return VIEW_COUNT;
}
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
switch (position) {
case 0:
fragment = Fragment1.newInstance(context_);
break;
case 1:
fragment = Fragment2.newInstance(context_);
break;
case 2:
fragment = Fragment3.newInstance(context_);
break;
default:
break;
}
return fragment;
}
}
Редактировать.
Так что, похоже, я не совсем ясно выразился в своем вопросе. Я решил удалить все спагетти, которые мне удалось создать ранее, и попытался заявить, что я их не использовал (см. текст, выделенный жирным шрифтом выше).
Во всяком случае, вот что я пытался сделать внутри getItem():
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
switch (position) {
case 0:
if (!app.isUserLoggedIn) {
if (loginFragment_ == null) {
loginFragment_ = LoginFragment.newInstance(context_);
transaction_ = fragmentManager_.beginTransaction();
if (logoutFragment_ != null) {
transaction_.remove(logoutFragment_);
logoutFragment_ = null;
}
transaction_.add(loginFragment_, "login");
transaction_.commit();
}
if (fragmentManager_.findFragmentByTag("login") == null)
fragment = LoginFragment.newInstance(context_);
else
fragment = fragmentManager_.findFragmentByTag("login");
} else {
if (logoutFragment_ == null) {
logoutFragment_ = LogoutFragment.newInstance(context_);
transaction_ = fragmentManager_.beginTransaction();
if (loginFragment_ != null) {
transaction_.remove(loginFragment_);
loginFragment_ = null;
}
transaction_.add(logoutFragment_, "logout");
transaction_.commit();
}
if (fragmentManager_.findFragmentByTag("logout") == null)
fragment = LogoutFragment.newInstance(context_);
else
fragment = fragmentManager_.findFragmentByTag("logout");
}
break;
case 1:
fragment = HomeFragment.newInstance(context_);
break;
case 2:
fragment = RegisterFragment.newInstance(context_);
break;
default:
break;
}
return fragment;
}
С этим кодом я ничего не делаю, но если кто-то увидит, что я делаю неправильно, и захочет указать мне правильное направление, я буду очень признателен!
ViewPager
иFragmentPagerAdapter
. - person jfritz42   schedule 22.12.2012