首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android :返回上一次按下的片段

Android :返回上一次按下的片段
EN

Stack Overflow用户
提问于 2014-08-17 23:01:43
回答 4查看 42.3K关注 0票数 19

我已经实现了导航抽屉,它是Activity的一个子类。我的应用程序中有很多片段。我的问题在这里

假设有3个片段:

Fragment_1 : Fragment_2 : Fragment_3

当我启动我的应用程序时,当我点击Fragment_1上的一些组件时,Fragment_1会被加载,我被导航到Fragment_2,等等。

所以这就像

Fragment_1 > Fragment_2 > Fragment_3

当我从Fragment_2按BACK键时,我被导航回Fragment_1,但当我从Fragment_3按BACK键时,我被导航回Fragment_1 (而不是Fragment_2)

我希望在我的后退键应用程序中有类似这样的东西

Fragment_1 < Fragment_2 < Fragment_3

我使用了Fragment、FragmentManager、FragmentTransaction,如下所示:

MyFragment fragment = new MyFragment();
FragmentManager fragmentManager = getFragmentManager();

fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).addToBackStack(null)commit();

我尝试在我的MainActivity中重写onBackPressed():

@Override
public void onBackPressed() {


        getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        int count = getFragmentManager().getBackStackEntryCount();
        if (count == 0)
               super.onBackPressed();
    }
EN

回答 4

Stack Overflow用户

发布于 2014-08-17 23:27:00

您必须实现您自己的backstack实现,如下所述

Separate Back Stack for each tab in Android using Fragments

您可以在单击片段中的后退按钮时调用popFragments(),并在从一个片段导航到另一个片段时调用pushFragments()。

总之,

public void onBackPressed()
{
    FragmentManager fm = getActivity().getSupportFragmentManager();
    fm.popBackStack();
}
票数 3
EN

Stack Overflow用户

发布于 2016-05-04 00:24:26

tric在FragmentManager#executePendingTransactions();中。

这也是我用于嵌套片段的原因...:

/**
 * if there is a fragment and the back stack of this fragment is not empty,
 * then emulate 'onBackPressed' behaviour, because in default, it is not working.
 *
 * @param fm the fragment manager to which we will try to dispatch the back pressed event.
 * @return {@code true} if the onBackPressed event was consumed by a child fragment, otherwise
 */
public static boolean dispatchOnBackPressedToFragments(FragmentManager fm) {

    List<Fragment> fragments = fm.getFragments();
    boolean result;
    if (fragments != null && !fragments.isEmpty()) {
        for (Fragment frag : fragments) {
            if (frag != null && frag.isAdded() && frag.getChildFragmentManager() != null) {
                // go to the next level of child fragments.
                result = dispatchOnBackPressedToFragments(frag.getChildFragmentManager());
                if (result) return true;
            }
        }
    }

    // if the back stack is not empty then we pop the last transaction.
    if (fm.getBackStackEntryCount() > 0) {
        fm.popBackStack();
        fm.executePendingTransactions();
        return true;
    }

    return false;
}

在我的onBackPressed中:

                if (!FragmentUtils.dispatchOnBackPressedToFragments(fm)) {
                    // if no child fragment consumed the onBackPressed event,
                    // we execute the default behaviour.
                    super.onBackPressed();
                }
票数 2
EN

Stack Overflow用户

发布于 2015-09-25 12:23:34

在主活动中的选项卡更改上使用此代码来清除堆栈。

int count = getFragmentManager().getBackStackEntryCount();
        if(count>0){
            for (int i = 0; i <count; i++) {
                getFragmentManager().popBackStack();
            }
        }

然后在你的主要活动的背部按下,这样做

 int count = getFragmentManager().getBackStackEntryCount();

     if (count == 0) {
         super.onbackpressed();
        }
else {
        getFragmentManager().popBackStack();
    }
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25350397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档