Я обнаружил эту проблему и выполнил следующее решение, чтобы исправить ее, но пока не смог решить эту проблему. А также я пытался использовать fragmentpageradapter
вместо fragmentstatepageradapter
, но все еще сталкивался с той же проблемой.
java.lang.IllegalStateException: Fragement no больше существует для ключа f1: индекс 3
этот сбой происходит, когда я возвращаюсь к фрагменту, который содержит окно просмотра.
Любая идея?
сначала помещаем детальный фрагмент товара в "основной контейнер"
public void switchToProductDetail(SearchHelper searchHelper, Product product)
{
ProductDetailFragment productDetailFragment = new ProductDetailFragment();
productDetailFragment.product = product;
productDetailFragment.searchHelper = searchHelper;
setNewFragment(productDetailFragment, R.id.mainContainer, "ProductDetail", true, true, true, true);
}
а затем, если пользователь не входит в систему и нажимает кнопку «Добавить в избранное», я помещаю фрагмент подписки в контейнер «окно».
public void switchtoSignIn(SignInSignUpFragment.SignInCompleteCallBack callBack)
{
SignInSignUpFragment signInSignUpFragment = new SignInSignUpFragment();
signInSignUpFragment.callBack = callBack;
setNewFragment(signInSignUpFragment, R.id.windowFL, "SignIn", true, true, true, true);
}
И основная активность xml (которая содержит maincontainer и windowFL)
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/windowFL"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:id="@+id/headerContainer" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/mainContainer"/>
</LinearLayout>
<LinearLayout
android:id="@+id/left_menu_frame"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_marginRight="@dimen/menumargin"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#ffffff" />
</android.support.v4.widget.DrawerLayout>
setnewfragment метод:
@SuppressLint("CommitTransaction")
public void setNewFragment(final Fragment fragment, final int containerId, final String tag, final boolean shouldAddBackStack, final boolean shouldReplace, final boolean shouldAnimation, final boolean shouldDrawerClose) {
if(isAnyMenuOpen() && shouldDrawerClose)
{
drawerLayout.closeDrawer(GravityCompat.START, true);
drawerClosedCallBack = new DrawerClosedCallBack() {
@Override
public void onDrawerClosed() {
setNewFragment(fragment, containerId, tag, shouldAddBackStack, shouldReplace, shouldAnimation, false);
}
};
return;
}
if (fragmentManager == null)
{
fragmentManager = getSupportFragmentManager();
}
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
if (shouldAnimation)
{
if(fragment instanceof SignInSignUpFragment)
{
fragmentTransaction.setCustomAnimations(R.anim.slide_in_bottom, R.anim.fade_out, R.anim.fade_in, R.anim.slide_out_bottom);
}
else
{
fragmentTransaction.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right);
}
}
if (shouldReplace)
{
fragmentTransaction.replace(containerId, fragment);
}
else
{
fragmentTransaction.add(containerId, fragment);
}
if(shouldAddBackStack)
{
fragmentTransaction.addToBackStack(tag);
}
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
fragmentTransaction.commitAllowingStateLoss();
}