Code Monkey home page Code Monkey logo

Comments (6)

Zhuinden avatar Zhuinden commented on May 29, 2024 2

The original Flow did have a replaceTop() operator but for whatever reason I never had a need for it even though we've used it in multiple projects, so it's not a "first-class" method in simple-stack.

But the following would do exactly that:

Backstack backstack = backstackDelegate.getBackstack(); // lifecycle integration
backstack.setHistory(HistoryBuilder.from(backstack)
                                    .removeLast()
                                    .add([key of fragmentA(new)])
                                    .build(), 
                                    StateChange.REPLACE);

You might also find removeUntil() helpful on the HistoryBuilder.


Then again, this use-case:

fragmentB, finishes or closes and passes data to another instance of fragmentA

fragmentA(old) will be closed and replaced with fragmentA(new) to imitate that the view has been updated through the use of fragmentB

I did run into this and unless you want to update the arguments bundle, you can use a MessageQueue of sorts as you can see in the mvvm-sample which you can see is used here

from simple-stack.

johnernest02 avatar johnernest02 commented on May 29, 2024

Thank you very much! I'll try the MessageQueue solution when I have more time on my hands

from simple-stack.

johnernest02 avatar johnernest02 commented on May 29, 2024

Sorry another question, how do I get the currently displayed fragment using BackStack?

from simple-stack.

Zhuinden avatar Zhuinden commented on May 29, 2024

uh, that is the responsibility of the StateChanger. Which in my case tends to be the Activity itself.

So to make the Backstack show a given fragment, what you need to do is handle the transition between the previous state and the new state, in this case using the FragmentTransaction's API. Without calling addToBackStack() on it, because that changes fragment behavior.

For example, if you only want to show the top fragment, then it is a good choice to detach the ones that are not visible, attach the top, and add it if it's not even in the fragment manager yet.

        for(Key oldKey : stateChange.<Key>getPreviousState()) {
            Fragment fragment = fragmentManager.findFragmentByTag(oldKey.getFragmentTag());
            if(fragment != null) { // already added
                if(!stateChange.getNewState().contains(oldKey)) {
                    fragmentTransaction.remove(fragment); // no longer exists
                } else if(!fragment.isDetached()) {
                    fragmentTransaction.detach(fragment); // it will not be the new top so it can be detached
                }
            }
        }

and

        for(Key newKey : stateChange.<Key>getNewState()) {
            Fragment fragment = fragmentManager.findFragmentByTag(newKey.getFragmentTag());
            if(newKey.equals(stateChange.topNewState())) { // if is top
                if(fragment != null) {
                    if(fragment.isDetached()) {
                        fragmentTransaction.attach(fragment); // then if exists and is detached, attach
                    }
                } else {
                    fragment = newKey.newFragment(); // is not added, so add it
                    fragmentTransaction.add(containerId, fragment, newKey.getFragmentTag());
                }
            } else {
                if(fragment != null && !fragment.isDetached()) { // not top - should be detached
                    fragmentTransaction.detach(fragment);
                }
            }
        }

It might seem a bit clunky at first but it's actually surprisingly easy to customize, we had a bit more custom behavior to it to define what should be added, hidden, attached, etc.

from simple-stack.

johnernest02 avatar johnernest02 commented on May 29, 2024

Thank you very much for your help

from simple-stack.

Zhuinden avatar Zhuinden commented on May 29, 2024

@dev-JE02 I've just checked this question again and I think I might have answered the wrong question?

The answer to checking the current top is just backstack.top(), then you can access the fragment tag and use findFragmentByTag() to get the fragment.

from simple-stack.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.