导航抽屉,处理后退按钮去上一个片段? [英] Navigation drawer, handling the back button to go to previous fragments?

查看:23
本文介绍了导航抽屉,处理后退按钮去上一个片段?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm using the built-in navigation drawer to run my app. I can't quite figure out how to handle the back button. When it's pressed I want it to load the very first fragment again. Fragment1.

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

So when the app launches you see Fragment1 launched. They can then click on Fragment 2-5 to go to other pages. Within all of these pages, I want the back button to take the user back to Fragment1. The only place the user should be able to exit the app via the back button is Fragment1.

因为这一切都是由 FragmentActivity 处理的,所以我尝试弄乱那里的后退按钮.但是,我不断收到强制关闭错误:

Since it's all handled by a FragmentActivity I tried messing with the back button there. I keep getting a force close error, however:

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

这是我目前所拥有的:

我确保像这样将片段添加到后端堆栈:

I've made sure to add the fragments to the back stack like this:

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();
    }
    
}

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

Does anyone know what I need to do? Do I need to call onBackPressed in every fragment (if that's even possible) rather than the FragmentActivity that controls the drawer? In my past apps I've been OK with the back button closing the app regardless of which Fragment the user is on but the one I'm making now I want the back button to go back to Fragment1.

非常感谢您的帮助,谢谢.

Would really appreciate some help, thank you.

onItemClick

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);
        }

推荐答案

代替:

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

调用:

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

addToBackStack 与 add 一起使用.

addToBackStack works with add.

replace 函数删除前一个片段并放置新片段,因此在您的后台堆栈中始终只有一个片段.所以使用 add 函数将之前的片段保留在堆栈中.

replace function removes previous fragment and places new fragment so on your back-stack there is only one fragment all the time. So use add function to keep previous fragments on stack.

要始终从任何片段 onBackPress 转到 fragemnt1,请尝试执行以下操作:

To always goto fragemnt1 from any fragment onBackPress try to do following:

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

这将从 backstack 中删除最后一个事务并添加新的事务.试试这个.

this will remove last transaction from backstack and add new one. Try this.

这篇关于导航抽屉,处理后退按钮去上一个片段?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆