在导航抽屉中具有多个片段的活动中按后退按钮时退出应用程序

Hoa*_*inh 10 android android-fragments navigation-drawer

我正在开发一款需要导航抽屉的应用.这个应用程序有1个MainActivity和大约10个片段.当我单击MainActivity中的导航抽屉图标时,它将显示10个片段,以便我可以选择每个片段.

我选择片段A,然后选择B,然后选择C ...到F.当我在片段F并按下后退按钮时,它会将我带回片段E,然后再返回它将带我去片段D ...

我的问题是,当我回到片段A(当然是从片段B)并再次按下"返回"按钮时,它会将我带到一个空白的白色屏幕(我认为这是主要的活动布局).然后再按回来,应用程序将退出.

我想要的是当我回到片段A(最后一个片段)并点击返回时,应用程序将立即退出,而不是空白的白色屏幕

我搜索了SO并发现了一个类似的问题,但还没有答案,所以我不得不提出另一个问题

我怎样才能做到这一点?非常感谢你

Ali*_*har 9

只需在倒数第二个屏幕退出应用程序

  public void onBackPressed() {

    if (manager.getBackStackEntryCount() > 1 ) {
        // If there are back-stack entries, leave the FragmentActivity
        // implementation take care of them.
        manager.popBackStack();

    } else {
        // Otherwise, ask user if he wants to leave :)
        new AlertDialog.Builder(this)
                .setTitle("Really Exit?")
                .setMessage("Are you sure you want to exit?")
                .setNegativeButton(android.R.string.no, null)
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface arg0, int arg1) {
                        MainActivity.super.onBackPressed();
                    }
                }).create().show();
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

从片段A中删除addToBackStack()。希望能有所帮助。


小智 5

我想我是另一个没有回答的问题,所以我想告诉你我的解决方法:

我检查FrameLayout中是否有一个孩子.如果有的话,我会回去一个片段.然后再检查一下.因为我确实只知道白色屏幕,所以我需要在它之后检查0个孩子.如果还存在另一个片段,则无处可做,但如果childs == 0,则要求离开该活动.

或者,如果到达最后一个片段,您可以删除AlertDialog并关闭应用程序.

@Override
public void onBackPressed() {
    FrameLayout fl = (FrameLayout) findViewById(R.id.content_frame);
    if (fl.getChildCount() == 1) {
        super.onBackPressed();
        if (fl.getChildCount() == 0) {
            new AlertDialog.Builder(this)
                    .setTitle("Close App?")
                    .setMessage("Do you really want to close this beautiful app?")
                    .setPositiveButton("YES",
                            new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog,
                                        int which) {
                                    finish();
                                }
                            })
                    .setNegativeButton("NO",
                            new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog,
                                        int which) {
                                }
                            }).show();
            // load your first Fragment here
        }
    } else if (fl.getChildCount() == 0) {
        // load your first Fragment here
    } else {
        super.onBackPressed();
    }
}
Run Code Online (Sandbox Code Playgroud)