Skip to content

Instantly share code, notes, and snippets.

@WarrenFaith
Last active November 11, 2016 13:05
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save WarrenFaith/141608cb164d6fcae0e8 to your computer and use it in GitHub Desktop.
Save WarrenFaith/141608cb164d6fcae0e8 to your computer and use it in GitHub Desktop.
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import com.project.R;
import com.project.fragment.BaseFragment;
import com.project.module.DialogNavigation;
import com.project.module.Navigation;
import java.util.List;
/**
* @author Martin Breuer
*/
public final class FragmentUtils {
private FragmentUtils() {
// helper class hides constructor
}
public static void navigateTo(@NonNull final FragmentActivity activity, @NonNull final Navigation navigation) {
navigateTo(activity, navigation, false);
}
public static void navigateTo(@NonNull final FragmentActivity activity, @NonNull final Navigation navigation, final boolean withStateLoss) {
navigateTo(activity, navigation, null, withStateLoss);
}
public static void navigateTo(@NonNull final FragmentActivity activity, @NonNull final Navigation navigation, @Nullable final Bundle bundle) {
navigateTo(activity, navigation, bundle, false);
}
public static void navigateTo(@NonNull final FragmentActivity activity, @NonNull final Navigation navigation,
@Nullable final Bundle bundle, final boolean withStateLoss) {
AndroidUtils.hideKeyboard(activity);
final FragmentTransaction fragmentTransaction = activity.getSupportFragmentManager().beginTransaction();
fragmentTransaction.addToBackStack(navigation.getTag());
fragmentTransaction.replace(R.id.main_container, navigation.newInstance(bundle), navigation.getTag());
if (withStateLoss) {
fragmentTransaction.commitAllowingStateLoss();
} else {
fragmentTransaction.commit();
}
}
public static void setAsRoot(@NonNull final FragmentActivity activity, @NonNull final Navigation navigation) {
setAsRoot(activity, navigation, false);
}
public static void setAsRoot(@NonNull final FragmentActivity activity, @NonNull final Navigation navigation, final boolean withStateLoss) {
final FragmentTransaction fragmentTransaction = activity.getSupportFragmentManager().beginTransaction();
clearBackStack(activity.getSupportFragmentManager());
fragmentTransaction.replace(R.id.main_container, navigation.newInstance(), navigation.getTag());
if (withStateLoss) {
fragmentTransaction.commitAllowingStateLoss();
} else {
fragmentTransaction.commit();
}
}
public static void restoreOrSetAsRoot(@NonNull final FragmentActivity activity, @NonNull final Navigation navigation) {
restoreOrSetAsRoot(activity, navigation, false);
}
public static void restoreOrSetAsRoot(@NonNull final FragmentActivity activity, @NonNull final Navigation navigation, final boolean withStateLoss) {
final FragmentManager manager = activity.getSupportFragmentManager();
int backStackCount = manager.getBackStackEntryCount();
Fragment restoredFragment = null;
if (backStackCount > 0) {
final String fragmentTag = manager.getBackStackEntryAt(backStackCount - 1).getName();
restoredFragment = manager.findFragmentByTag(fragmentTag);
} else {
List<Fragment> fragmentList = manager.getFragments();
if (fragmentList != null && fragmentList.size() == 1) {
restoredFragment = fragmentList.get(0);
}
}
if (restoredFragment == null) {
restoredFragment = manager.findFragmentByTag(navigation.getTag());
}
if (restoredFragment == null) {
setAsRoot(activity, navigation, true);
} else {
final FragmentTransaction fragmentTransaction = manager.beginTransaction();
fragmentTransaction.replace(R.id.main_container, restoredFragment, restoredFragment.getClass().getSimpleName());
if (withStateLoss) {
fragmentTransaction.commitAllowingStateLoss();
} else {
fragmentTransaction.commit();
}
}
}
private static void clearBackStack(@NonNull final FragmentManager manager) {
while (manager.popBackStackImmediate()) {
// nothing to do
}
}
public static DialogFragment showDialog(@NonNull final FragmentActivity activity, @NonNull final DialogNavigation dialogNavigation) {
return dialogNavigation.show(activity.getSupportFragmentManager());
}
@Nullable
public static BaseFragment getCurrentFragment(FragmentActivity activity) {
final FragmentManager manager = activity.getSupportFragmentManager();
int backStackCount = manager.getBackStackEntryCount();
Fragment restoredFragment = null;
if (backStackCount > 0) {
final String fragmentTag = manager.getBackStackEntryAt(backStackCount - 1).getName();
restoredFragment = manager.findFragmentByTag(fragmentTag);
}
List<Fragment> fragmentList = manager.getFragments();
if (fragmentList != null && fragmentList.size() > 0) {
restoredFragment = fragmentList.get(0);
}
return (BaseFragment) restoredFragment;
}
@Nullable
public static DialogFragment getCurrentDialogFragment(@NonNull final FragmentActivity activity) {
for (Fragment fragment : activity.getSupportFragmentManager().getFragments()) {
if (fragment instanceof DialogFragment && fragment.isAdded() && !fragment.isHidden()) {
return (DialogFragment) fragment;
}
}
return null;
}
}
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import com.project.fragment.BaseFragment;
import com.project.module.game.fragment.ClubDetailsFragment_;
import com.project.module.game.fragment.LeagueTableFragment_;
import com.project.module.game.fragment.NewsListFragment_;
import com.project.module.game.fragment.PlayerListFragment_;
import com.project.module.game.fragment.StrategyPagerFragment_;
import com.project.module.game.fragment.TrainingPagerFragment_;
import com.project.module.startmenu.fragment.CreateManagerFragment_;
import com.project.module.startmenu.fragment.MainMenuFragment_;
import com.project.module.startmenu.fragment.SelectStartingClubFragment_;
/**
* @author Martin Breuer
*/
public enum Navigation {
SHOW_MAIN_MENU(MainMenuFragment_.class),
CREATE_MANAGER(CreateManagerFragment_.class),
SELECT_STARTING_CLUB(SelectStartingClubFragment_.class),
SHOW_PLAYERS_LIST(PlayerListFragment_.class),
SHOW_NEWS_SECTION(NewsListFragment_.class),
SHOW_LEAGUE_TABLE(LeagueTableFragment_.class),
SHOW_CLUB_DETAILS(ClubDetailsFragment_.class),
SHOW_TRAINING_PAGER(TrainingPagerFragment_.class),
SHOW_STRATEGY_PAGER(StrategyPagerFragment_.class);
Class<? extends BaseFragment> mBaseFragmentClass;
Navigation(Class<? extends BaseFragment> baseFragmentClass) {
mBaseFragmentClass = baseFragmentClass;
}
@Nullable
public BaseFragment newInstance() {
return newInstance(null);
}
@Nullable
@SuppressWarnings("all")
public BaseFragment newInstance(@Nullable Bundle bundle) {
try {
BaseFragment fragment = mBaseFragmentClass.newInstance();
if (bundle != null) {
fragment.setArguments(bundle);
}
return fragment;
} catch (InstantiationException e) {
Log.e("Navigation", "::newInstance", e);
} catch (IllegalAccessException e) {
Log.e("Navigation", "::newInstance", e);
}
return null;
}
@NonNull
public String getTag() {
return mBaseFragmentClass.getSimpleName();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment