Skip to content

Instantly share code, notes, and snippets.

@swissonid
Created May 30, 2015 19:20
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save swissonid/aafe6341d198c7935a2b to your computer and use it in GitHub Desktop.
Save swissonid/aafe6341d198c7935a2b to your computer and use it in GitHub Desktop.
A simple Navigator Class that helps to avoid mistakes by handling with the FragmentManager
public class Navigator{
private final FragmentManager mFragmentManager;
public Navigator(final FragmentManager fragmentManager){
mFragmentManager = fragmentManager;
}
public Fragment getActiveFragment() {
if (mFragmentManager.getBackStackEntryCount() == 0) {
return null;
}
String tag = mFragmentManager
.getBackStackEntryAt(mFragmentManager.getBackStackEntryCount() - 1).getName();
return mFragmentManager.findFragmentByTag(tag);
}
/**
* Pushes the fragment, and add to the back stack
*/
public void goTo(Fragment fragment) {
mFragmentManager.beginTransaction()
.addToBackStack(getName(fragment))
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.replace(R.id.container, fragment, getName(fragment))
.commit();
mFragmentManager.executePendingTransactions();
}
private String getName(Fragment fragment) {
return fragment.getClass().getName();
}
/**
* Set the new root fragment. If there is any entry in the backstack it will be deleted.
*
* @param startFragment the new root fragment
*/
public void setRootFragment(Fragment startFragment){
if(getSize() > 0){
this.clearHistory();
}
this.replaceFragment(startFragment);
}
/**
* Replace the current fragment with the given one, without to add it to backstack.
* So when the users navigates away from the given fragment it will not appaer in
* the history.
*
* @param fragment the new fragment
*/
protected void replaceFragment(Fragment fragment) {
mFragmentManager.beginTransaction()
.replace(R.id.container, fragment, fragment.getClass().getSimpleName())
.commit();
mFragmentManager.executePendingTransactions();
}
/**
* Pops the back stack
*/
public void goOneFragmentBack() {
mFragmentManager.popBackStackImmediate();
}
public int getSize() {
return mFragmentManager.getBackStackEntryCount();
}
public boolean isEmpty() {
return getSize() == 0;
}
/**
* Pops to root Fragment
*/
public void gotToTheStartFragmentBack() {
for (int i = 0; i <= mFragmentManager.getBackStackEntryCount(); ++i) {
goOneFragmentBack();
}
}
public void clearHistory() {
while(mFragmentManager.popBackStackImmediate());
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment