ncapdevi / FragNav

An Android library for managing multiple stacks of fragments
1.5k stars 220 forks source link

clearStack() for all tabs #90

Closed pdapnz closed 7 years ago

pdapnz commented 7 years ago

Hi! Is any possibility to clear stacks at all tabs? Unfortunately clearStack() method of FragNavController clear stack only at current tab. But I need to clear all tab's stacks without switching to each.

ncapdevi commented 7 years ago

Interesting. There's a couple of ways you could do it currently. First, and what I do in an instance, is to retain an instance of your FragNavController.Builder object that you create initially. Then all you have to do is

fragNavController = fragNavBuilder.build() and it will rebuild your controller to the initial state.

Another option would be to create a new builder from the current state. By that I mean, if you wanted to use the current tab or something and not completely reinitialize the Controller you could do something like

fragNavController = new FragNavController.Builder(null,getSupportFragmentManager(), R.id.container)
.selectedTabIndex(fragNavController.getCurrentStackIndex())
.build();

Does that answer your question?

pdapnz commented 7 years ago

I actually tried this approach - just create new instance of FragNavController. But seems it rather "heavy" operation. After such manipulation Glide loaded images missing in some places. I think that this happens due to large resource using, when re-instance of FragNavController. So I deicide add invalidateStack[TAB_N] variable for each tab, which store flag that cache should be cleared during switching to tab. This is much faster than rebuild FragNavController.

Some code snippets:

   ...........
    private boolean[] mInvalidateStacks = new boolean[] {false, false, false, false, false};
   ...........
    public void invalidateStacks() {
        mInvalidateStacks[INDEX_1] = true;
        mInvalidateStacks[INDEX_2] = true;
        mInvalidateStacks[INDEX_3] = true;
        mInvalidateStacks[INDEX_4] = true;
        mInvalidateStacks[INDEX_5] = true;
    }
   ...........
    @Override
    public void onTabSelected(@IdRes int tabId) {
        switch (tabId) {
            case R.id.bb_menu_events:
                mNavController.switchTab(INDEX_1);
                if (mInvalidateStacks[INDEX_1]) {
                    mNavController.clearStack();
                    mInvalidateStacks[INDEX_1] = false;
                }
                break;
            case R.id.bb_menu_info:
                mNavController.switchTab(INDEX_2);
                if (mInvalidateStacks[INDEX_2]) {
                    mNavController.clearStack();
                    mInvalidateStacks[INDEX_2] = false;
                }
                break;
            case R.id.bb_menu_main:
                mNavController.switchTab(INDEX_3);
                if (mInvalidateStacks[INDEX_3]) {
                    mNavController.clearStack();
                    mInvalidateStacks[INDEX_3] = false;
                }
                break;
            case R.id.bb_menu_settings:
                mNavController.switchTab(INDEX_4);
                if (mInvalidateStacks[INDEX_4]) {
                    mNavController.clearStack();
                    mInvalidateStacks[INDEX_4] = false;
                }
                break;
            case R.id.bb_menu_commands:
                mNavController.switchTab(INDEX_5);
                if (mInvalidateStacks[INDEX_5) {
                    mNavController.clearStack();
                    mInvalidateStacks[INDEX_5] = false;
                }
                break;
        }
    }

Nevertheless thank you so much for this library! It is very useful for me =)