【问题标题】:Press back button twice to exit the app with some condition在某些情况下按两次后退按钮以退出应用程序
【发布时间】:2016-09-26 12:32:21
【问题描述】:

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

我的应用程序的一个部分包含一个图库,当单击图片时,会打开一个显示全屏图像的片段。在这个全屏图像中按下后退按钮时,我想回到画廊片段。我通过将片段添加到后堆栈来做到这一点。

但是在应用程序的其他部分,当按下后退按钮时,我想显示一个祝酒词“请再次单击 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();
    }
}

显然,它没有用。

【问题讨论】:

  • 请确认您是否使用 getFragmentManager() 或 getSupportFragmentManager() 将片段添加到后台堆栈
  • @Nitesh:getFragmentManager()。你能帮忙吗?
  • 你的代码对我来说看起来不错..你能告诉你按下后退按钮时发生了什么吗?
  • @Nitesh:当我从 fullimage 片段中单击返回按钮时,我并没有回到画廊片段,而是收到了 toast 消息:“请再次单击 BACK 以退出”。我必须从完整的图像片段中点击两次返回按钮才能返回图库。

标签: android android-fragments onbackpressed


【解决方案1】:

您可以尝试使用 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?

【讨论】:

  • 现在它甚至没有显示 toast 消息。应用程序在第一次按下后退按钮时关闭
  • sry 我的错 .. 更新我的答案
  • 现在当我点击返回按钮时应用程序根本没有退出
  • 您有更好的解决方案吗?
  • 这个对我有用。所以调试你的代码对你来说是更好的选择。
【解决方案2】:

你可以尝试一些不同的东西。在您的活动的onBackPressed 方法中添加退出代码,并且每当您获得onBackPressed 触发器时只需检查您的图库片段是否处于活动状态? ,如果是则执行退出代码,否则更改Fragment。

//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");

希望这会奏效..!

【讨论】:

  • 您是否添加了带有 Fragment 的标签?并在 Activity 中添加此代码?
  • 是的,我做到了。但我在行中遇到错误:“MyGalleryFragment myFragment = (MyGalleryFragment)getFragmentManager().findFragmentByTag("MY_FRAGMENT");”所以我做了这样的事情:“ Fragment myFragment = getFragmentManager().findFragmentByTag("a");"
  • @TomAlex 我在这里举个例子,你需要使用自己的片段名称而不是 MyGalleryFragment 并且 dntt 忘记添加标签。
【解决方案3】:

尝试使用

super.onBackPressed();

而不是

getFragmentManager().popBackStack();

让我们知道结果。

【讨论】:

  • 同样的结果。问题是控件总是进入 else 部分。即使在将片段添加到后台堆栈之后也是如此。即,即使在 (getFragmentManager().getBackStackEntryCount()>0) 为假之后。知道发生了什么吗?
  • 您使用什么类型的活动?是 AppCompatActivity 还是 FragmentActivity?
猜你喜欢
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
相关资源
最近更新 更多