Closed pdapnz closed 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?
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 =)
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.