/** * Pops the top item if the stack. * If the fragment implements {@link OnBackPressedHandlingFragment}, calls {@link OnBackPressedHandlingFragment#onBackPressed()} instead. * If {@link OnBackPressedHandlingFragment#onBackPressed()} returns false the fragment gets popped. * * @return true if a fragment has been popped or if {@link OnBackPressedHandlingFragment#onBackPressed()} returned true; */ public boolean back() { Fragment top = peek(); if (top instanceof OnBackPressedHandlingFragment) { if (((OnBackPressedHandlingFragment)top).onBackPressed()) return true; } return pop(); }
public void push(Fragment fragment) { fragmentStack.push(fragment); }
public void replace(Fragment fragment) { fragmentStack.replace(fragment); } }
@UiThreadTest public void testBack() throws Exception { FragmentManager manager = activity.getSupportFragmentManager(); FragmentStack stack = new FragmentStack(activity, manager, CONTAINER_ID); assertFalse(stack.back()); stack.push(new TestFragment1()); assertEquals(1, stack.size()); assertFalse(stack.back()); stack.push(new TestFragment1()); assertEquals(2, stack.size()); assertTrue(stack.back()); assertEquals(1, stack.size()); }
@UiThreadTest public void testPushReplace() throws Exception { FragmentManager manager = activity.getSupportFragmentManager(); FragmentStack stack = new FragmentStack(activity, manager, CONTAINER_ID); TestFragment1 fragment = new TestFragment1(); stack.push(fragment); TestFragment2 fragment2 = new TestFragment2(); stack.push(fragment2); TestFragment1 fragment3 = new TestFragment1(); stack.replace(fragment3); assertTopFragment(manager, stack, fragment3, 0); assertNull(manager.findFragmentByTag("1")); }
@UiThreadTest public void testPushPop() throws Exception { FragmentManager manager = activity.getSupportFragmentManager(); FragmentStack stack = new FragmentStack(activity, manager, CONTAINER_ID); TestFragment1 fragment = new TestFragment1(); stack.push(fragment); assertTopFragment(manager, stack, fragment, 0); TestFragment2 fragment2 = new TestFragment2(); stack.push(fragment2); assertFragment(manager, fragment, 0); assertTopFragment(manager, stack, fragment2, 1); assertFalse(fragment.isAdded()); assertTrue(fragment2.isAdded()); assertTrue(stack.pop()); assertTopFragment(manager, stack, fragment, 0); assertNull(manager.findFragmentByTag("1")); assertFalse(stack.pop()); assertTopFragment(manager, stack, fragment, 0); }
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fragmentStack = new FragmentStack(this, getSupportFragmentManager(), R.id.fragmentContainer); if (savedInstanceState == null) fragmentStack.replace(new MainFragment()); }
@UiThreadTest public void testFindCallback() throws Exception { FragmentManager manager = activity.getSupportFragmentManager(); FragmentStack stack = new FragmentStack(activity, manager, CONTAINER_ID); TestFragmentC fragment = new TestFragmentC(); stack.push(fragment); TestFragment2 fragment2 = new TestFragment2(); stack.push(fragment2); assertEquals(fragment, stack.findCallback(fragment2, TestCallback.class)); assertEquals(activity, stack.findCallback(fragment2, Activity.class)); assertNull(stack.findCallback(fragment2, String.class)); }
/** * Pushes a fragment to the top of the stack. */ public void push(Fragment fragment) { Fragment top = peek(); if (top != null) { manager.beginTransaction() .setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right) .remove(top) .add(containerId, fragment, indexToTag(manager.getBackStackEntryCount() + 1)) .addToBackStack(null) .commit(); } else { manager.beginTransaction() .add(containerId, fragment, indexToTag(0)) .commit(); } manager.executePendingTransactions(); }
@Override public void onBackPressed() { if (!fragmentStack.pop()) super.onBackPressed(); }
private void assertTopFragment(FragmentManager manager, FragmentStack stack, Fragment fragment, int index) { assertFragment(manager, fragment, index); assertEquals(fragment, manager.findFragmentById(CONTAINER_ID)); assertEquals(fragment, stack.peek()); assertEquals(index, manager.getBackStackEntryCount()); }
/** * Returns the number of fragments in the stack. * * @return the number of fragments in the stack. */ public int size() { return getFragments().size(); }
/** * Replaces stack contents with just one fragment. */ public void replace(Fragment fragment) { manager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); manager.beginTransaction() .replace(containerId, fragment, indexToTag(0)) .commit(); manager.executePendingTransactions(); }
/** * Returns a back fragment if the fragment is of given class. * If such fragment does not exist and activity implements the given class then the activity will be returned. * * @param fragment a fragment to search from. * @param callbackType a class of type for callback to search. * @param <T> a type of callback. * @return a back fragment or activity. */ @SuppressWarnings("unchecked") public <T> T findCallback(Fragment fragment, Class<T> callbackType) { Fragment back = getBackFragment(fragment); if (back != null && callbackType.isAssignableFrom(back.getClass())) return (T)back; if (callbackType.isAssignableFrom(activity.getClass())) return (T)activity; return null; }
@UiThreadTest public void testReplace() throws Exception { FragmentManager manager = activity.getSupportFragmentManager(); FragmentStack stack = new FragmentStack(activity, manager, CONTAINER_ID); TestFragment1 fragment = new TestFragment1(); stack.replace(fragment); assertTopFragment(manager, stack, fragment, 0); TestFragment2 fragment2 = new TestFragment2(); stack.replace(fragment2); assertTopFragment(manager, stack, fragment2, 0); }
private Fragment getBackFragment(Fragment fragment) { List<Fragment> fragments = getFragments(); for (int f = fragments.size() - 1; f >= 0; f--) { if (fragments.get(f) == fragment && f > 0) return fragments.get(f - 1); } return null; }
private List<Fragment> getFragments() { List<Fragment> fragments = new ArrayList<>(manager.getBackStackEntryCount() + 1); for (int i = 0; i < manager.getBackStackEntryCount() + 1; i++) { Fragment fragment = manager.findFragmentByTag(indexToTag(i)); if (fragment != null) fragments.add(fragment); } return fragments; }