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

RED*_*ED_ 33 android android-fragments android-fragmentactivity navigation-drawer

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

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

所有这些都是由FragmentActivity处理的,我试着弄乱那里的后门按钮.然而,我一直收到一个强制关闭错误:

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

这是我到目前为止:

我确保将片段添加到后台堆栈中,如下所示:

fm.beginTransaction().replace(R.id.main, newFragment).addToBackStack("fragBack").commit();
Run Code Online (Sandbox Code Playgroud)

返回键:

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

}
Run Code Online (Sandbox Code Playgroud)

有谁知道我需要做什么?我是否需要在每个片段中调用onBackPressed(如果可能的话),而不是控制抽屉的FragmentActivity?在我过去的应用程序中,无论用户使用哪个片段,我都可以使用后退按钮关闭应用程序但是我现在正在制作的那个片段我希望后退按钮返回到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);
        }
Run Code Online (Sandbox Code Playgroud)

vip*_*tal 36

代替:

fm.beginTransaction().replace(R.id.main, newFragment).addToBackStack("fragBack").commit();
Run Code Online (Sandbox Code Playgroud)

呼叫:

fm.beginTransaction().add(R.id.main, newFragment).addToBackStack("fragBack").commit();
Run Code Online (Sandbox Code Playgroud)

addToBackStack可以使用add.

replace函数删除前一个片段并将新片段放在你的后台上,只有一个片段.因此,使用add函数将先前的片段保留在堆栈上.

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

getFragmentManager().popBackStack();
fm.beginTransaction().add(R.id.main, newFragment).addToBackStack("fragBack").commit();
Run Code Online (Sandbox Code Playgroud)

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


Kyl*_*yle 6

只是想报告我的发现,即使这个问题对于其他可能在接受的答案中遇到同样问题的人来说有点老了.对我来说,在接受的答案中建议的方法,使层重叠,很快使它们不可读.下面的代码(改编自已接受的答案)避免了覆盖,但仍然将屏幕添加到后台.

fragmentManager.beginTransaction().replace(R.id.container, fragment).addToBackStack("fragBack").commit();
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人!