【问题标题】:Android - Confirm app exit with toastAndroid - 用 toast 确认应用退出
【发布时间】:2012-12-22 20:48:14
【问题描述】:

我是 Android 开发新手,我希望这样当用户按下主 Activity 上的后退按钮时,会出现一条 toast 消息,其中包含“再次按下后退按钮确认退出”消息。我该怎么做?这是我目前所拥有的:

@Override
public void onBackPressed() {
    // TODO Auto-generated method stub
    super.onBackPressed();
    Toast s = Toast.makeText(getBaseContext(), "Press back again to exit", Toast.LENGTH_LONG);
    s.show();
    wait();

    public boolean onBackPressed() {
        finish();    
    }
}

【问题讨论】:

  • 吐司显示了吗?什么是/不工作?在那里有一个计数器可能会更好,如果计数器 = 2 然后完成。或者使用对话框而不是 toast

标签: android exit toast back confirm


【解决方案1】:

我只会保存回压的时间,然后将最近一次按下的时间与新按下的时间进行比较。

long lastPress;
@Override
public void onBackPressed() {
    long currentTime = System.currentTimeMillis();
    if(currentTime - lastPress > 5000){
        Toast.makeText(getBaseContext(), "Press back again to exit", Toast.LENGTH_LONG).show();
        lastPress = currentTime;
    }else{
        super.onBackPressed();
    }
}

您也可以在确认应用程序后按时关闭 toast (cred @ToolmakerSteve):

long lastPress;
Toast backpressToast;
@Override
public void onBackPressed() {
    long currentTime = System.currentTimeMillis();
    if(currentTime - lastPress > 5000){
        backpressToast = Toast.makeText(getBaseContext(), "Press back again to exit", Toast.LENGTH_LONG);
        backpressToast.show();
        lastPress = currentTime;
    } else {
        if (backpressToast != null) backpressToast.cancel();
        super.onBackPressed();
    }
}

【讨论】:

  • 谢谢,这就是我想做的!用祝酒词而不是对话框:)
  • 这对于那些在许多其他主题上徘徊的人来说是正确的解决方案!
  • 另请参阅 user8218 对此的增强,一旦用户第二次按下,它就会删除 toast:stackoverflow.com/a/18654014/199364 但是 user8218 的答案是错误的;提交我在评论中解释的更改;希望我的更改会被接受。
  • @ToolmakerSteve 更新了我的答案,请确认它看起来不错。
  • 看起来很棒!谢谢。 (现在不需要人们查看 user8218 的答案;这个答案是完整的。感谢 user8218 的想法。如果您喜欢这个补充,请考虑也支持该答案。)
【解决方案2】:
private long mLastPress = 0;
const int TOAST_DURATION = 5000;
Toast onBackPressedToast;
@Override
public void onBackPressed() {
    long currentTime = System.currentTimeMillis();
    if (currentTime - mLastPress > TOAST_DURATION) {
        onBackPressedToast = Toast.makeText(this, R.string.press_once_again_to_exit, Toast.LENGTH_SHORT);
        onBackPressedToast.show();
        mLastPress = currentTime;
    } else {
        if (onBackPressedToast != null) {
            onBackPressedToast.cancel();  //Difference with previous answer. Prevent continuing showing toast after application exit.
            onBackPressedToast = null;
        }
        super.onBackPressed();
    }
}

【讨论】:

  • 在上一个答案中,吐司仅在第一次后按时创建,并且在您的回答中不会取消吐司。
  • [作为编辑提交] 可以通过在方法外的字段中保存 toast 来解决此问题(根据 @Heinrisch 的评论):方法前的Toast onBackPressedToast;。然后将onBackPressedToast = Toast... 移动到if 内。在else 中,使用if (onBackPressedToast != null) 保护取消。
  • 还需要const int TOAST_DURATION = 5000;
  • ... 当我们取消它时,还不如将 toast 变量设置为 null。
  • @ToolmakerSteve 如果应用程序无论如何都会退出,我们为什么要将 toast 设置为 null?
【解决方案3】:

在我的情况下完美运行

private static long back_pressed;

@Override
public void onBackPressed()
{
        if (back_pressed + 2000 > System.currentTimeMillis()) 
               super.onBackPressed();
        else 
             Toast.makeText(getBaseContext(), "Press once again to exit!", Toast.LENGTH_SHORT).show();
        back_pressed = System.currentTimeMillis();
}

【讨论】:

  • 请解释与两年前最受好评的答案的不同之处。有什么不同,这对那个答案有何改进?此外,是什么证明了将其作为新答案而不是对该答案的评论? (恕我直言,它更好地服务于未来的读者,建议对现有答案的 cmets 进行小的更改,而不是创建一个全新的答案。)
【解决方案4】:

在较新的版本中,您可以使用小吃吧代替吐司。

import android.support.design.widget.Snackbar;
...
Snackbar.make(content, "Click BACK again to exit", Snackbar.LENGTH_SHORT).setAction("Action", null).show();
...

【讨论】:

    【解决方案5】:

    在多次实现相同的行为之后,决定继续为相同的行为构建一个库:DoubleBackPress Android Library。它提供了许多易于使用的模板和双后压行为,没有任何麻烦。

    只要做:

    // set the ToastDisplay to be shown on FirstBackPress
    FirstBackPressAction firstBackPressAction = new ToastDisplay().standard(this);
    
    // set the Action on DoubleBackPress
    DoubleBackPressAction doubleBackPressAction = new DoubleBackPressAction() {
        @Override
        public void actionCall() {
            finish();
        }
    };
    
    // setup DoubleBackPress behaviour
    DoubleBackPress doubleBackPress = new DoubleBackPress()
            .withDoublePressDuration(3000)
            .withFirstBackPressAction(firstBackPressAction)
            .withDoubleBackPressAction(doubleBackPressAction);
    

    最后,用 DoubleBackPress 行为覆盖 onBackPressed 以进行后按。

    @Override
    public void onBackPressed() {
        doubleBackPress.onBackPressed();
    }
    

    Example GIF for similar behaviour

    【讨论】:

      【解决方案6】:

      Toast 的最佳和简单解决方案

      在 Java 中

      private Toast exitToast;
      
      @Override
      public void onBackPressed() {
          if (exitToast == null || exitToast.getView() == null || exitToast.getView().getWindowToken() == null) {
              exitToast = Toast.makeText(this, "Press again to exit", Toast.LENGTH_LONG);
              exitToast.show();
          } else {
              exitToast.cancel();
              finish();
          }
      }
      

      在科特林中

      private var exitToast: Toast? = null
      
      override fun onBackPressed() {
          if (exitToast == null || exitToast!!.view == null || exitToast!!.view.windowToken == null) {
              exitToast = Toast.makeText(this, "Press again to exit", Toast.LENGTH_LONG)
              exitToast!!.show()
          } else {
              exitToast!!.cancel()
              finish()
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-16
        • 1970-01-01
        • 2016-05-10
        • 1970-01-01
        • 2018-12-14
        • 1970-01-01
        相关资源
        最近更新 更多