/** * Version of {@link #show(FragmentManager, String)} that no-ops when an IllegalStateException * would otherwise occur. */ public void showAllowingStateLoss(FragmentManager manager, String tag) { if (manager.isStateSaved()) { return; } show(manager, tag); }
@Override public void show(FragmentManager manager, String tag) { if (manager == null || manager.isDestroyed() || manager.isStateSaved()) { // do nothing!!! return; } try { super.show(manager, tag); } catch (IllegalStateException e) { // 防御:java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState e.printStackTrace(); } }
@Override public void activate(@NonNull MainActivity mainActivity, @NonNull MenuItem menuItem, @NonNull NavigationMenu navigationMenu) { FragmentManager fragmentManager = mainActivity.getSupportFragmentManager(); if (fragmentManager.isStateSaved()) { return; } updateMainActivity(mainActivity, menuItem, navigationMenu); startFragment(fragmentManager); }
/** * shows the consent dialog * * @param activity the parent activity of the dialog * @param setup the setup for the dialog * @param location the request location */ public void showDialog(AppCompatActivity activity, GDPRSetup setup, GDPRLocation location) { FragmentManager fm = activity.getSupportFragmentManager(); if (fm.findFragmentByTag(GDPRDialog.class.getName()) != null) { // dialog already exists, it either is already shown or will be shown automatically if activity is recreated return; } try { if (fm.isStateSaved()) { // in this case, activity will be destroyed, we ignore this call return; } showDialog(fm, activity, setup, location); } catch (NoSuchMethodError e) { // Support Library Version < 26.1.0 is used, isStateSaved is not yet existing... // we just catch the exception and ignore it try { showDialog(fm, activity, setup, location); } catch (IllegalStateException e2) { // ignored, activity is probably just being destroyed... } } }
@Test public void testActivateWithStateSaved() { // setup FragmentItem fixture = new FragmentItem(fragment, true); String title = "title"; NavigationMenu navigationMenu = NavigationMenu.ACCESS_POINTS; when(mainActivity.getSupportFragmentManager()).thenReturn(fragmentManager); when(fragmentManager.isStateSaved()).thenReturn(true); // execute fixture.activate(mainActivity, menuItem, navigationMenu); // validate verify(mainActivity).getSupportFragmentManager(); verify(fragmentManager).isStateSaved(); verifyFragmentManagerIsNotCalled(); verifyNoChangesToMainActivity(title, navigationMenu); }
@Test public void testActivateWithStateNotSaved() { // setup FragmentItem fixture = new FragmentItem(fragment, true); String title = "title"; NavigationMenu navigationMenu = NavigationMenu.ACCESS_POINTS; when(mainActivity.getSupportFragmentManager()).thenReturn(fragmentManager); when(fragmentManager.isStateSaved()).thenReturn(false); withFragmentTransaction(); when(menuItem.getTitle()).thenReturn(title); // execute fixture.activate(mainActivity, menuItem, navigationMenu); // validate verify(mainActivity).getSupportFragmentManager(); verify(fragmentManager).isStateSaved(); verifyFragmentManager(); verifyMainActivityChanges(title, navigationMenu); }