处理导航抽屉和片段页面的返回键

Handling back key for navigation drawer and fragment page

我正在开发一个应用程序,其中的片段页面很少,而且我还有导航抽屉菜单。

当我在任何片段页面上单击返回键时,应用程序退出对话框工作正常。但是当我在任何片段页面上并且同时单击导航菜单时,导航菜单位于顶部。现在,如果我点击后退键,应用程序退出按钮就会出现,但我希望导航菜单应该先消失,而不是退出对话框。

onBackPressed() 代码:

public void onBackPressed() 
{
        final FragmentManager fm = getSupportFragmentManager();

       if(fm.getBackStackEntryCount() != 1){
           super.onBackPressed();

        }
        else
        {

            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
            alertDialogBuilder.setTitle("Exit Application?");
            alertDialogBuilder
                    .setMessage("Click yes to exit!")
                    .setCancelable(false)
                    .setPositiveButton("Yes",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    moveTaskToBack(true);
                                    android.os.Process.killProcess(android.os.Process.myPid());
                                    System.exit(1);
                                }
                            })

                    .setNegativeButton("No", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {

                            dialog.cancel();
                        }
                    });

            AlertDialog alertDialog = alertDialogBuilder.create();
            alertDialog.show();
        }
    }

============================================= =============================

Code for onDrawerItemClick():

private void onDrawerItemClick(final int item) {
        UserService userService = new UserService(this);
        switch (item) {
            case TEST1:
                test1();
                break;
            case TEST2:
                test2();
                break;
            case LOGOUT:
                userService.logout();
                finish();
                Toast.makeText(MenuActivity.this, "LOGOUT", Toast.LENGTH_SHORT).show();
                break;
        }
        mDrawerLayout.closeDrawer(GravityCompat.START);
    }
 @Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawerlayout);
    assert drawer != null;
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

onBackPressed() 中,首先你必须检查抽屉是否打开,如果打开则关闭它,否则执行正常操作。

你的情况是这样的:

public void onBackPressed() 
{
    final FragmentManager fm = getSupportFragmentManager();
    if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
        mDrawerLayout.closeDrawer(GravityCompat.START);
    } else if(fm.getBackStackEntryCount() != 1){
       super.onBackPressed();
    }
    else
    {

        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setTitle("Exit Application?");
        alertDialogBuilder
                .setMessage("Click yes to exit!")
                .setCancelable(false)
                .setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                moveTaskToBack(true);
                                android.os.Process.killProcess(android.os.Process.myPid());
                                System.exit(1);
                            }
                        })

                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        dialog.cancel();
                    }
                });

        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();
    }
}

太简单了。让我告诉你我的想法:

public void onBackPressed() 
{
    //The first line, you should check your drawer status.
    if(drawerIsOpen){
        closeDrawer();
    }
    else{
        //show your exit dialog.
    }
}