下面列出了android.support.v4.app.FragmentManager#popBackStack ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
/**
* 将back事件分发给 FragmentManager 中管理的子Fragment,如果该 FragmentManager 中的所有Fragment都
* 没有处理back事件,则尝试 FragmentManager.popBackStack()
*
* @return 如果处理了back键则返回 <b>true</b>
* @see #handleBackPress(Fragment)
* @see #handleBackPress(FragmentActivity)
*/
public static boolean handleBackPress(FragmentManager fragmentManager) {
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments == null) return false;
for (int i = fragments.size() - 1; i >= 0; i--) {
Fragment child = fragments.get(i);
if (isFragmentBackHandled(child)) {
return true;
}
}
if (fragmentManager.getBackStackEntryCount() > 0) {
fragmentManager.popBackStack();
return true;
}
return false;
}
private void onFriendPickerDone(FriendPickerFragment fragment) {
FragmentManager fm = getSupportFragmentManager();
fm.popBackStack();
String results = "";
Collection<GraphUser> selection = fragment.getSelection();
if (selection != null && selection.size() > 0) {
ArrayList<String> names = new ArrayList<String>();
for (GraphUser user : selection) {
names.add(user.getName());
}
results = TextUtils.join(", ", names);
} else {
results = getString(R.string.no_friends_selected);
}
showAlert(getString(R.string.you_picked), results);
}
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);
}
}
@Override
public boolean onNavigateUp() {
FragmentManager fm = this.getSupportFragmentManager();
if(fm.getBackStackEntryCount()>1){
fm.popBackStack();
return true;
}else{
super.onBackPressed();
return true;
}
}
private void startFileListFragment(){
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
fragmentManager.beginTransaction().
replace(R.id.content_layout, new FileListFragment()).
commit();
}
@Override
public boolean onSupportNavigateUp() {
FragmentManager fragmentManager = getSupportFragmentManager();
if (fragmentManager.getBackStackEntryCount() > 0) {
fragmentManager.popBackStack();
} else {
Intent intent = new Intent(this, ConversationListActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
}
return true;
}
private boolean popFragment() {
FragmentManager fragmentManager = getSupportFragmentManager();
if (fragmentManager.getBackStackEntryCount() > 0) {
fragmentManager.popBackStack();
return true;
}
return false;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
// Handle action buttons
switch (item.getItemId())
{
case android.R.id.home:
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0)
{
View v = getCurrentFocus();
if (v != null)
{
// Hide keyboard
final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
fm.popBackStack();
return true;
}
else
{
if (mDrawerToggle.onOptionsItemSelected(item))
{
return true;
}
}
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onBackPressed() {
final FragmentManager fm = getSupportFragmentManager();
final Fragment fragment = fm.findFragmentByTag(Const.FragmentTags.MAP_INFO_EXPANDED);
if (fragment != null) {
fm.popBackStack();
} else {
super.onBackPressed();
}
}
public static void addFragmentToActivity(FragmentManager fragmentManager, Fragment fragment,
int frameId) {
for (int i = 0; i < fragmentManager.getBackStackEntryCount(); ++i) {
fragmentManager.popBackStack();
}
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(frameId, fragment);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
transaction.commit();
}
@Override
public void onBackPressed() {
if (binding.drawer.isDrawerOpen(GravityCompat.START)) {
binding.drawer.closeDrawer(GravityCompat.START);
return;
}
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack();
return;
}
super.onBackPressed();
}
@Override
public void onBackPressed() {
final FragmentManager fragmentManager = getSupportFragmentManager();
if (fragmentManager != null) {
final int backStackEntryCount = fragmentManager.getBackStackEntryCount();
Fragment fragment = fragmentManager.findFragmentByTag(TAG_OFFLINE_METHODS_FRAGMENT);
if (fragment instanceof BackHandler) {
final boolean shouldHandleBack = ((BackHandler) fragment).handleBack();
if (!shouldHandleBack) {
return;
}
}
fragment = fragmentManager.findFragmentByTag(CardFormWithFragment.TAG);
if (fragment != null && fragment.getChildFragmentManager().getBackStackEntryCount() > 0) {
fragment.getChildFragmentManager().popBackStack();
return;
}
if (backStackEntryCount > 0) {
fragmentManager.popBackStack();
return;
}
fragment =
FragmentUtil.getFragmentByTag(fragmentManager, PayButtonFragment.TAG, PayButtonFragment.class);
if (fragment == null || !((PayButtonFragment) fragment).isExploding()) {
super.onBackPressed();
}
}
}
@Override
public void onBackPressed() {
FragmentManager fm = this.getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 1) {
fm.popBackStack();
} else {
finish();
}
}
private void addFragment(FragmentActivity activity, Fragment fragment, String tag, boolean isVisible) {
FragmentManager manager = activity.getSupportFragmentManager();
Fragment oldInstance = manager.findFragmentByTag(tag);
if (oldInstance == null) {
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(android.R.id.content, fragment, tag);
if (!isVisible) {
transaction.hide(fragment);
} else if (tag.equals(TABS_TAG)) {
manager.popBackStack(TABS_BACK_STACK, FragmentManager.POP_BACK_STACK_INCLUSIVE);
transaction.addToBackStack(TABS_BACK_STACK);
}
transaction.commit();
}
}
@Override
public void onBackPressed() {
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack();
return;
}
super.onBackPressed();
}
@Override
public boolean onNavigateUp() {
FragmentManager fm = this.getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 1) {
fm.popBackStack();
return true;
} else {
finish();
return true;
}
}
/**
* This method allows to clear backStack
*/
public void clearFragmentBackStack() {
// create a FragmentManager
FragmentManager fm = getSupportFragmentManager();
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
protected void popFragment() {
FragmentManager fragmentManager = getProvider().provideFragmentManager();
fragmentManager.popBackStack();
}
public void goBack() throws NavigatorException {
FragmentManager fragmentManager = ((FragmentActivity) mContext).getSupportFragmentManager();
if (canGoBack(fragmentManager)) {
fragmentManager.popBackStack();
}
}
private void performBackNav(final NavigationManager.Event.OnLocationBack event) {
FragmentManager fm = getChildFragmentManager();
NavLocation lastLoc = event.getLastValue();
if (lastLoc != null) {
String lastFragTag = getFragmentTag(lastLoc.getLocationId());
final MvcFragment lastFrag = (MvcFragment) fm.findFragmentByTag(lastFragTag);
if (lastFrag != null) {
lastFrag.onPopAway();
}
}
NavLocation currentLoc = event.getCurrentValue();
if (currentLoc == null) {
MvcActivity act = (MvcActivity) getActivity();
act.actionsOnDestroy.add(new Runnable() {
@Override
public void run() {
destroyNavigator(event.getNavigator());
pendingNavActions.remove(this);
}
});
MvcActivity mvcActivity = ((MvcActivity) getActivity());
//Back to null which should finish the current activity
mvcActivity.performSuperBackKeyPressed();
mvcActivity.toPrintAppExitMessage = true;
} else {
String currentFragTag = getFragmentTag(currentLoc.getLocationId());
final MvcFragment currentFrag = (MvcFragment) fm.findFragmentByTag(currentFragTag);
if (currentFrag != null) {
traverseFragmentAndSubFragments(currentFrag, new FragmentManipulator() {
@Override
public void manipulate(Fragment fragment) {
if (fragment != null && fragment instanceof MvcFragment) {
final MvcFragment frag = ((MvcFragment) fragment);
frag.aboutToPopOut = true;
frag.registerOnViewReadyListener(new Runnable() {
@Override
public void run() {
destroyNavigator(event.getNavigator());
frag.unregisterOnViewReadyListener(this);
}
});
}
}
});
}
if (event.isFastRewind()) {
if (currentLoc.getPreviousLocation() == null) {
if (fm.getBackStackEntryCount() <= 1) {
//Has reached bottom. Does nothing in this case
return;
}
//Pop fragments to the last
int stackCount = fm.getBackStackEntryCount();
int timesNeedToPop = 0;
for (int i = 0; i < stackCount; i++) {
if (currentFragTag.equals(fm.getBackStackEntryAt(i).getName())) {
timesNeedToPop++;
}
}
if (timesNeedToPop > 1) {
for (int i = 0; i < stackCount - 1; i++) {
fm.popBackStack();
}
fm.executePendingTransactions();
} else {
fm.popBackStack(currentFragTag, 0);
}
logger.trace("Navigation back: Fast rewind to home location {}", currentLoc.getLocationId());
} else {
String tag = getFragmentTag(currentLoc.getLocationId());
fm.popBackStack(tag, 0);
logger.trace("Navigation back: Fast rewind to given location {}", currentLoc.getLocationId());
}
} else {
fm.popBackStack();
logger.trace("Navigation back: On step back from {} to location {}",
event.getLastValue() != null ? event.getLastValue().getLocationId() : null,
currentLoc.getLocationId());
}
}
}