Android Double Back按此按钮关闭具有片段的应用程序

Dr.*_*ari 5 android android-fragments onbackpressed

我按照本教程和SO上的某些类似答案.

我现在的onBackPressed代码如下 -

private static final int TIME_DELAY = 2000;
private static long back_pressed;

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        int fragments = getFragmentManager().getBackStackEntryCount();
        if (fragments > 0) {
            super.onBackPressed();
        } else {
            if (back_pressed + TIME_DELAY > System.currentTimeMillis()) {
                super.onBackPressed();
            } else {
                Toast.makeText(getBaseContext(), "Press once again to exit!",
                        Toast.LENGTH_SHORT).show();
            }
            back_pressed = System.currentTimeMillis();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在向这样的堆栈添加片段(在某些地方我不添加到后台堆栈) -

private void LoadSignDetailsFragment() {
    Bundle args = new Bundle();
    Fragment fragment = new SignDetailsFragment();
    args.putBoolean("hasValues", true);
    args.putBoolean("showBookmarkedSignsOnly", showBookmarkedSignsOnly);
    args.putInt("sign_id", signId);
    if (fragment != null) {
        FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
        fragment.setArguments(args);
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);
        fragmentTransaction.replace(R.id.container_body, fragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是,如果backstack中有任何片段,则单个onBackPressed迁移到之前的片段.但是,如果在Backstack中没有Fragment,它应该显示Toast for double back press以关闭应用程序.

我现在的代码,总是显示Toast,并要求Double back press,而不管backstack中是否存在碎片.我无法弄清楚为什么?

him*_*496 27

您可以参考以下代码了解您的需求.如果您不使用v4支持片段,那么您必须使用getFragmentManager()而不是getSupportFragmentManager()获取backstack计数.这里我使用布尔值来检查是否单击了后退,如果在2秒内没有再次单击它,它将再次变为false.

boolean doubleBackToExitPressedOnce = false;
@Override
public void onBackPressed() {
    //Checking for fragment count on backstack
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        getSupportFragmentManager().popBackStack();
    } else if (!doubleBackToExitPressedOnce) {
        this.doubleBackToExitPressedOnce = true;
        Toast.makeText(this,"Please click BACK again to exit.", Toast.LENGTH_SHORT).show();

        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                doubleBackToExitPressedOnce = false;
            }
        }, 2000);
    } else {
        super.onBackPressed();
        return;
    }
}
Run Code Online (Sandbox Code Playgroud)