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)