按两次后退按钮以退出具有某些条件的应用程序

时间:2016-09-26 12:32:21

标签: android android-fragments onbackpressed

我只想在后台堆栈为空时退出应用程序。

我的应用程序的一部分包含一个库,其中,当单击图片时,将打开显示全屏图像的片段。在此全屏图像中按下后退按钮时,我想返回到图库片段。我通过将片段添加到后台堆栈来完成此操作。

但是在应用程序的其他部分,当按下后退按钮时,我想要显示一个祝酒词“请再次单击BACK退出”。再次按下后退按钮时,应用程序将关闭。我怎样才能做到这一点?

这是我到目前为止所做的:

 boolean doubleBackToExitPressedOnce = false;
@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0 ){
       getFragmentManager().popBackStack();
    } else {

        if (doubleBackToExitPressedOnce) {
            super.onBackPressed();
            return;
        }

        this.doubleBackToExitPressedOnce = true;
        commonTasks.ShowStringMessage("Please click BACK again to exit");

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

            @Override
            public void run() {
                doubleBackToExitPressedOnce=false;
            }
        }, 2000);

       //super.onBackPressed();
    }
}

显然,它没有用。

3 个答案:

答案 0 :(得分:0)

您可以尝试使用getSupportFragmentManager()

它有一个方法可以返回它包含的所有片段的数组,您可以检查其大小如下

boolean doubleBackToExitPressedOnce = false;
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getFragments().size() > 0 ){
   getSupportFragmentManager().popBackStack();
} else {

    if (doubleBackToExitPressedOnce) {
        super.onBackPressed();
        return;
    }

    this.doubleBackToExitPressedOnce = true;
    commonTasks.ShowStringMessage("Please click BACK again to exit");

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

        @Override
        public void run() {
            doubleBackToExitPressedOnce=false;
        }
    }, 2000);

   //super.onBackPressed();
}

}

P.S:您还需要在片段横切时更改getSupportFragmentManager()

同时提供此链接 Why FragmentManager's getBackStackEntryCount() return zero?

答案 1 :(得分:0)

你可以试试diff。在您的活动的onBackPressed方法中添加退出代码,并在您获得onBackPressed触发器时添加退出代码只需检查您的图库片段是否有效? ,如果是,则执行退出代码,否则更改片段。

//define as field variable
private boolean doubleBackToExit = false;

MyGalleryFragment myFragment = (MyGalleryFragment)getFragmentManager().findFragmentByTag("MY_FRAGMENT");
if (myFragment != null && myFragment.isVisible()) {

    if (doubleBackToExit) {
        super.onBackPressed();
        finishAffinity();
        return;
    }
    this.doubleBackToExit = true;
    toastMsg(getResources().getString(R.string.touch_again_to_exit));

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            doubleBackToExit = false;
        }
    }, 2000);
} else {
    //Change Layout/Fragment
}

不要忘记在片段中添加标签...

fragTrans.replace(android.R.id.content, myFragment, "MY_FRAGMENT");

希望这会有效..!

答案 2 :(得分:0)

尝试使用

super.onBackPressed();

而不是

getFragmentManager().popBackStack();

告诉我们结果。