下面列出了android.support.v4.app.FragmentManager#BackStackEntry ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
public boolean canGoBack(String tag, int container, FragmentManager fragmentManager) {
if (TextUtils.isEmpty(tag)) {
return (fragmentManager.getBackStackEntryCount() > 1);
} else {
List<FragmentManager.BackStackEntry> fragmentList = fragmentList();
Fragment fragment = fragmentManager.findFragmentById(container);
if (fragment != null && tag.equalsIgnoreCase(fragment.getTag())) {
return false;
}
for (int i = 0; i < fragmentList.size(); i++) {
if (tag.equalsIgnoreCase(fragmentList.get(i).getName())) {
return true;
}
}
return false;
}
}
public void goBackTo(String tag) throws NavigatorException {
FragmentManager fragmentManager = ((FragmentActivity) mContext).getSupportFragmentManager();
if (fragmentManager.findFragmentByTag(tag) != null) {
List<FragmentManager.BackStackEntry> fragmentList = fragmentList();
Collections.reverse(fragmentList);
for (int i = 0; i < fragmentList.size(); i++) {
if (!tag.equalsIgnoreCase(fragmentList.get(i).getName())) {
fragmentManager.popBackStack();
} else {
listStep.add(tag);
return;
}
}
} else {
Log.e(TAG, "no fragment found");
String message = "Fragment with TAG[" + tag + "] not found into backstack entry";
throw new NavigatorException(message);
}
}
/**
* @param tag point to return
* @throws NavigatorException navigator specific error
*/
public void goBackToSpecificPoint(String tag) throws NavigatorException {
FragmentManager fragmentManager = ((FragmentActivity) mContextReference.getContext()).getSupportFragmentManager();
if (fragmentManager.findFragmentByTag(tag) != null) {
List<FragmentManager.BackStackEntry> fragmentList = fragmentList();
Collections.reverse(fragmentList);
for (int i = 0; i < fragmentList.size(); i++) {
if (!tag.equalsIgnoreCase(fragmentList.get(i).getName())) {
fragmentManager.popBackStack();
} else {
break;
}
}
} else {
Log.e(TAG, "no fragment found");
String message = "Fragment with TAG[" + tag + "] not found into back stack entry";
throw new NavigatorException(message);
}
}
/**
* @param tag point to return
* @param container id container
* @param fragmentManager variable contain fragment stack
* @return true if is possible return to tag param
*/
public boolean canGoBackToSpecificPoint(String tag, int container, FragmentManager fragmentManager) {
if (TextUtils.isEmpty(tag)) {
return (fragmentManager.getBackStackEntryCount() > 1);
} else {
List<FragmentManager.BackStackEntry> fragmentList = fragmentList();
Fragment fragment = fragmentManager.findFragmentById(container);
if (fragment != null && tag.equalsIgnoreCase(fragment.getTag())) {
return false;
}
for (int i = 0; i < fragmentList.size(); i++) {
if (tag.equalsIgnoreCase(fragmentList.get(i).getName())) {
return true;
}
}
return false;
}
}
/**
* Method clear fragment backStack (back history). On bottom of stack will remain Fragment added by {@link #addInitialFragment()}.
*/
private void clearBackStack() {
Timber.d("Clearing backStack");
FragmentManager manager = getSupportFragmentManager();
if (manager.getBackStackEntryCount() > 0) {
if (BuildConfig.DEBUG) {
for (int i = 0; i < manager.getBackStackEntryCount(); i++) {
Timber.d("BackStack content_%d= id: %d, name: %s", i, manager.getBackStackEntryAt(i).getId(), manager.getBackStackEntryAt(i).getName());
}
}
FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0);
manager.popBackStackImmediate(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
Timber.d("backStack cleared.");
// TODO maybe implement own fragment backStack handling to prevent banner fragment recreation during clearing.
// http://stackoverflow.com/questions/12529499/problems-with-android-fragment-back-stack
}
private int setTitleFromBackStack() {
final int count = getFragmentManager().getBackStackEntryCount();
if (count == 0) {
if (mInitialTitleResId > 0) {
setTitle(mInitialTitleResId);
} else {
setTitle(mInitialTitle);
}
return 0;
}
FragmentManager.BackStackEntry bse = getSupportFragmentManager().getBackStackEntryAt(count - 1);
setTitleFromBackStackEntry(bse);
return count;
}
private int setTitleFromBackStack() {
final int count = getFragmentManager().getBackStackEntryCount();
if (count == 0) {
if (mInitialTitleResId > 0) {
setTitle(mInitialTitleResId);
} else {
setTitle(mInitialTitle);
}
return 0;
}
FragmentManager.BackStackEntry bse = getSupportFragmentManager().getBackStackEntryAt(count - 1);
setTitleFromBackStackEntry(bse);
return count;
}
@Override
public void addFragment(Fragment fragment, String tag)
{
FragmentManager fm = getSupportFragmentManager();
// Get topmost fragment
Fragment parent;
if (fm.getBackStackEntryCount() > 0)
{
FragmentManager.BackStackEntry bse = fm.getBackStackEntryAt(fm.getBackStackEntryCount() - 1);
parent = fm.findFragmentByTag(bse.getName());
}
else
{
parent = fm.findFragmentById(R.id.content_frame);
}
FragmentTransaction ft = fm.beginTransaction();
// Detach parent
ft.detach(parent);
// Add new fragment to back stack
ft.add(R.id.content_frame, fragment, tag);
ft.addToBackStack(tag);
ft.commit();
}
/**
* Pop all fragments.
*
* @param fm The manager of fragment.
*/
public static void popAll(@NonNull final FragmentManager fm, final boolean isImmediate) {
if (fm.getBackStackEntryCount() > 0) {
FragmentManager.BackStackEntry entry = fm.getBackStackEntryAt(0);
if (isImmediate) {
fm.popBackStackImmediate(entry.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
} else {
fm.popBackStack(entry.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}
}
/**
* @return tag of fragment that is actually visible, return null if no fragment are added in back stack
*/
public String getActualTag() {
List<FragmentManager.BackStackEntry> fragmentList = fragmentList();
if (fragmentList == null || fragmentList.size() == 0) {
return null;
}
return fragmentList.get(fragmentList.size() - 1).getName();
}
private void setTitleFromBackStackEntry(FragmentManager.BackStackEntry bse) {
final CharSequence title;
final int titleRes = bse.getBreadCrumbTitleRes();
if (titleRes > 0) {
title = getText(titleRes);
} else {
title = bse.getBreadCrumbTitle();
}
if (title != null) {
setTitle(title);
}
}
private void setTitleFromBackStackEntry(FragmentManager.BackStackEntry bse) {
final CharSequence title;
final int titleRes = bse.getBreadCrumbTitleRes();
if (titleRes > 0) {
title = getText(titleRes);
} else {
title = bse.getBreadCrumbTitle();
}
if (title != null) {
setTitle(title);
}
}
/**
* @param tag fragment tag
* @return true if fragment is actual visible, otherwise false
*/
public boolean isActualShowing(String tag) {
List<FragmentManager.BackStackEntry> fragmentList = fragmentList();
return fragmentList.get(fragmentList.size() - 1).getName().equals(tag);
}