Android Double Back按下关闭有碎片的应用程序



我遵循了本教程和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();
        }
    }
}

我像这样将碎片添加到后堆栈(在某些地方我不添加到后栈)-

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

我想做的是,如果backpack中有任何片段,单个onBackPressed迁移到前一个片段。但是,如果后台没有Fragment,它应该显示Toast,以便双击关闭应用程序。

我现在的代码,总是显示Toast,并要求双重背压,而不管背后有没有碎片。我不知道为什么?

您可以根据需要参考以下代码。如果您没有使用v4支持片段,那么您必须使用getFragmentManager()而不是getSupportFragmentManager()来获得后台计数。在这里,我使用布尔值来检查是否单击了back,如果在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;
    }
}
private boolean doubleBackToExitPressedOnce = true;
    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            if (doubleBackToExitPressedOnce) {
                this.doubleBackToExitPressedOnce = false;
                Toast.makeText(this,"Please click BACK again to exit.", Toast.LENGTH_SHORT).show();
            } else {
                finish();
            }
        }
    }
   @Override
   public void onBackPressed() {
       DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
       if (drawer.isDrawerOpen(GravityCompat.START)) {
          drawer.closeDrawer(GravityCompat.START);
       } else {
     //if navigation drawer here navhostfragment is primary fragment
       int fragments = 
                 getSupportFragmentManager().getPrimaryNavigationFragment()
                .getChildFragmentManager().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();
        }
      }
    }

用简单的方法使用低于代码的

Boolean doubleBackToExitPressedOnce = false;
@Override
public void onBackPressed() {
    if (doubleBackToExitPressedOnce) {
        super.onBackPressed();
        System.exit(0);
        return;
    }
    this.doubleBackToExitPressedOnce = true;
    Toast.makeText(this, "Please click BACK again to exit",
            Toast.LENGTH_SHORT).show();
}

在CreateView 的片段中添加此代码

    view.setOnKeyListener( new OnKeyListener()
{
  private Boolean exit = false;
    @Override
    public boolean onKey( View v, int keyCode, KeyEvent event )
    {
        if( keyCode == KeyEvent.KEYCODE_BACK )
        {
        //logic for identifying double back press, expires after 3 seconds
         if (exit) {
            getActivity().finish(); // finish activity
        } else {
            Toast.makeText(this, "Press Back again to Exit.",
                    Toast.LENGTH_SHORT).show();
            exit = true;
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    exit = false;
                }
            }, 3 * 1000);
        }
            return true;
        }
        return false;
    }
} );

或者,如果你想在你的活动中添加它,你必须覆盖onBackPressed方法并添加相同的代码。

示例

private Boolean exit = false;
@Override
public void onBackPressed(){
if (exit) {
            finish(); // finish activity
        } else {
            Toast.makeText(this, "Press Back again to Exit.",
                    Toast.LENGTH_SHORT).show();
            exit = true;
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    exit = false;
                }
            }, 3 * 1000);
        }    
}

但建议在片段以外的活动中进行

没有处理程序的方式:

@Override
public void onBackPressed() { 
    long currentMillis = System.currentTimeMillis();
    if (currentMillis - this.lastPressed < 2000 && getFragmentManager().getBackStackEntryCount() > 0) {
         getFragmentManager().popBackStack();
    } else {
        // show toast if you need
    }
    this.lastPressed = currentMillis;
}

最新更新