当前位置: 首页 > 知识库问答 >
问题:

导航抽屉,处理后退按钮以转到以前的片段?

乐正玺
2023-03-14

我正在使用内置的抽屉菜单来运行我的应用程序。我不太明白如何处理后退按钮。当它被按下时,我希望它再次加载第一个片段。Fragment1。

因此,当应用程序启动时,您会看到Fragment1启动。然后,他们可以单击片段2-5转到其他页面。在所有这些页面中,我希望后退按钮将用户带回Fragment1。用户应该能够通过后退按钮退出应用程序的唯一位置是Fragment1。

因为这一切都是由一个碎片活动来处理的,所以我试着在那里弄乱了后退按钮。我不断收到一个强制关闭错误,但是:

(01-11 14:09:33.114: E/AndroidRuntime(8292): android.view.InflateException: Binary XML file line #7: Error inflating class fragment)

这是我到目前为止所拥有的:

我已经确保将片段添加到后面的堆栈中,如下所示:

fm.beginTransaction().replace(R.id.main, newFragment).addToBackStack("fragBack").commit();

后退按钮:

@Override
public void onBackPressed() {
    if (getSupportFragmentManager().findFragmentByTag("fragBack") != null) {
        
    }
    else {
        super.onBackPressed();
        return;
    }
    if (getSupportFragmentManager().getBackStackEntryCount() != 0) {
        Toast.makeText(getApplicationContext(), "Test", Toast.LENGTH_LONG).show();
        Fragment frag = getSupportFragmentManager().findFragmentByTag("fragBack");
        FragmentTransaction transac = getSupportFragmentManager().beginTransaction().remove(frag);
                transac.commit();
    }
    
}

有人知道我需要做什么吗?我是否需要在每个片段中调用onBackPress(如果可能的话)而不是控制抽屉的Fragmentactive?在我过去的应用程序中,无论用户在哪个片段上,我都可以使用后退按钮关闭应用程序,但我现在正在制作的片段我希望后退按钮返回Fragment1。

非常感谢你的帮助,谢谢。

onItemClick公司

@Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            
            Fragment newFragment = new MapsPage();
            FragmentManager fm = getSupportFragmentManager();
            switch(i) {
            case 0:
                newFragment = new Fragment2();
                break;
            case 1:
                newFragment = new Fragment3();
                break;
            case 2:
                newFragment = new Fragment4();
                break;
            case 3:
                newFragment = new Fragment5();
                break;
            }
            fm.beginTransaction().add(R.id.main, newFragment).addToBackStack("fragback").commit();
            drawerLayout.closeDrawer(rl);
        }

共有3个答案

欧阳山
2023-03-14

在某些情况下,您必须使用replace,然后无法使用addtobackstack(),因此可以在MainActivity中使用此代码。在这段代码中,当您按back键时,总是转到第一个片段(我称之为HomeFragment),当您在HomeFragment中时,它会要求两次退出应用程序。

 private Boolean exit = false;
@Override
    public void onBackPressed() {
        if (exit) {
            super.onBackPressed();
            return;
        }

    try {
        FragmentManager fragmentManager = getSupportFragmentManager();
        Fragment fragment = fragmentManager.findFragmentByTag("HOME");
        if (fragment != null) {
            if (fragment.isVisible()) {
                this.exit = true;
                Toast.makeText(this, "Press Back again to Exit", Toast.LENGTH_SHORT).show();
            }
        }
        else {
            fragment = HomeFragment.class.newInstance();
            getFragmentManager().popBackStack();
            fragmentManager.beginTransaction().replace(R.id.flContent, fragment, "HOME").commit();
        }
    } catch (Exception e) {

    }
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            exit = false;
        }
    }, 2000);
}
孔睿
2023-03-14

我只是想报告我的发现,尽管这个问题对于其他可能对公认答案有同样问题的人来说有点过时了。对我来说,按照公认的答案中建议的方法,会使图层重叠,很快使其无法读取。下面的代码(根据接受的答案改编)避免了重叠,但仍将屏幕添加到后堆栈中。

fragmentManager.beginTransaction().replace(R.id.container, fragment).addToBackStack("fragBack").commit();
唐煜
2023-03-14

而不是:

fm.beginTransaction().replace(R.id.main, newFragment).addToBackStack("fragBack").commit();

电话:

fm.beginTransaction().add(R.id.main, newFragment).addToBackStack("fragBack").commit();

addToBackStack可与添加一起使用。

replace函数删除以前的片段并放置新片段,以便在后堆栈中始终只有一个片段。所以,使用add函数将以前的片段保留在堆栈上。

要始终从任何碎片返回到碎片1,请尝试执行以下操作:

getFragmentManager().popBackStack();
fm.beginTransaction().add(R.id.main, newFragment).addToBackStack("fragBack").commit();

这将从后栈中删除最后一个事务并添加新事务。试试这个。

 类似资料:
  • 我开始创建一个应用程序,它使用一个活动(导航抽屉)和许多片段。但我无法使用工具栏上的“后退”按钮从片段中导航回来。硬件后退按钮工作正常。我知道我需要覆盖选项ItemSelected,捕捉android。R、 id.home,检查后堆栈中是否有内容,然后弹出它。在更改片段后,“burger”按钮变为“back arrow”,但当我单击它时,选项ItemSelected将打开NavigationDra

  • 在我的应用程序中,我使用动作栏和导航抽屉。操作栏中有一个按钮用于打开和关闭导航抽屉。我想把它的颜色改成红色。我该怎么做?

  • 我有一个关于片段管理的问题。 我已经编写了一个基于碎片的抽屉活动。每次点击菜单项后,您都会看到一个空片段。 我如何实现这一点?

  • 我想知道如何使用导航控制器正确处理系统后退按钮动作。在我的应用程序中,我有两个片段(例如,fragment1和fragment2),我在fragment1中有一个操作,目标是fragment2。除了一件事之外,所有的工作都很好--当用户按下fragment2中的system back按钮时,我希望显示一个对话框(例如使用DialogFragment)来确认退出。实施这种行为的最佳方式是什么?如果我

  • 我正在开发一个android项目,我正在尝试使用来自http://developer.android.com/training/implementing-navigation/nav-drawer.html.的示例集成新的导航抽屉 它主要工作除了一件事,动作栏向上按钮不显示菜单,但如果我用手指从边缘滑动主活动屏幕,菜单就会出现,所以我知道实际菜单没有问题,它只是动作栏按钮。 下面是代码 感谢您提供

  • 所以我有一个活动,其中有一个片段,片段有一个导航抽屉和页面的内容。当我打开抽屉并单击一个项目时,片段被替换为一个新片段。当我按下后退按钮时,我在片段管理器上调用popBackStack,它返回到第一个片段,但导航抽屉是打开的。 有几件事要注意:当按下抽屉中的一个项目时,我在抽屉布局上调用关闭抽屉,当片段被替换时抽屉关闭。如果我按下操作栏中的UP按钮,我可以用新的主片段替换片段容器,但我更喜欢能够将