【问题标题】:finish activity when back button twice pressed? [duplicate]两次按下后退按钮时完成活动? [复制]
【发布时间】:2014-05-02 20:04:24
【问题描述】:

我在这里创建一个应用程序,当用户两次按下返回按钮时,我需要完成活动。这是我尝试过的代码

 @Override
public void onBackPressed() {
        super.onBackPressed();
        this.finish();
}

也试过了

 @Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if ((keyCode == KeyEvent.KEYCODE_BACK))
{
    finish();
}
return super.onKeyDown(keyCode, event);
}

这有助于我在按下后退按钮后完成活动。

我需要你的建议。提前致谢

【问题讨论】:

    标签: android android-layout android-intent


    【解决方案1】:

    好的...这是一种更长但有效的方法...

    1) 在您的班级中创建一个全局变量,例如...

    private boolean backPressedToExitOnce = false;
    private Toast toast = null;
    

    2)然后像这样实现activity的onBackPressed...

    @Override
    public void onBackPressed() {
        if (backPressedToExitOnce) {
            super.onBackPressed();
        } else {
            this.backPressedToExitOnce = true;
            showToast("Press again to exit");
            new Handler().postDelayed(new Runnable() {
    
                @Override
                public void run() {
                    backPressedToExitOnce = false;
                }
            }, 2000);
        }
    }
    

    3) 使用这个技巧来有效地处理这个吐司......

    /**
     * Created to make sure that you toast doesn't show miltiple times, if user pressed back
     * button more than once. 
     * @param message Message to show on toast.
     */
    private void showToast(String message) {
        if (this.toast == null) {
            // Create toast if found null, it would he the case of first call only
            this.toast = Toast.makeText(this, message, Toast.LENGTH_SHORT);
    
        } else if (this.toast.getView() == null) {
            // Toast not showing, so create new one
            this.toast = Toast.makeText(this, message, Toast.LENGTH_SHORT);
    
        } else {
            // Updating toast message is showing
            this.toast.setText(message);
        }
    
        // Showing toast finally
        this.toast.show();
    }
    

    4) 并在活动关闭时使用此技巧隐藏 toast...

    /**
     * Kill the toast if showing. Supposed to call from onPause() of activity.
     * So that toast also get removed as activity goes to background, to improve
     * better app experiance for user
     */
    private void killToast() {
        if (this.toast != null) {
            this.toast.cancel();
        }
    }
    

    5) 像这样实现 onPause(),当活动进入后台时立即杀死 toast

    @Override
    protected void onPause() {
        killToast();
        super.onPause();
    }
    

    希望这会有所帮助...:)

    【讨论】:

    • 我创建了一个类,添加了 ContextLENGTH 作为其参数,并使其成为静态的。现在在我的应用程序中全局使用它。谢谢
    • @Pedram 太好了,这是个好主意...
    【解决方案2】:

    我认为这是正确的方法是等待第二次回来

    private boolean _doubleBackToExitPressedOnce    = false;
    
    @Override
    public void onBackPressed() {
    
    Log.i(TAG, "onBackPressed--");
    if (_doubleBackToExitPressedOnce) {
        super.onBackPressed();
        return;
    }
    this._doubleBackToExitPressedOnce = true;
    Toast.makeText(this, "Press again to quit", Toast.LENGTH_SHORT).show();
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
    
            _doubleBackToExitPressedOnce = false;
        }
    }, 2000);
    }
    

    这对我有用...答案来自here

    【讨论】:

      【解决方案3】:

      使用布尔值检查按钮是否被按下两次

      boolean isFinsihActivity = false;
      
      @Override
      public void onBackPressed() {
          if (isFinsihActivity) {
              super.onBackPressed();
          }
          isFinsihActivity = true;
      }
      

      【讨论】:

        【解决方案4】:

        在您的 Activity 中维护一个全局变量

        private int count;
        

        在您的活动中覆盖 onBackPressed

        @Override
        public void onBackPressed() {
            if (count == 1) {
                super.onBackPressed();
            }
            count++;
        }
        

        【讨论】:

          【解决方案5】:

          尝试像这样用 0 初始化静态 int 变量,并在 onBackPressed() 中增加变量并检查其值为 2;

          public class MainActivity extends Activity {
          static int i=0;
          
              @Override
              protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.activity_main);
              }
          
              @Override
              public void onBackPressed(){
              i++;
              if(i==2){
          
                  finish();
          
              }
          
          }
          

          【讨论】:

          • 我觉得这不利于等待第二次回压
          【解决方案6】:

          这样做:

          int counter=0;
          
              @Override
              public void onBackPressed() {
                      super.onBackPressed();
                      counter+=1;
                      if(counter==2){
                      this.finish();}
              }
          

          【讨论】:

          • 但是第二次后压应该在两秒内发生
          【解决方案7】:

          我要做的是为第一次返回点击使用时间戳,如果它在时限内再次发生,我会完成。

          long mtimeOfFirstClick
          long TIME_LIMIT = 0.5 DateUtils.SECONDS_IN_MILLIS;
          
          public void onBackPressed() {
              if(System.currentTimeMillis() - mtimeOfFirstClick <= TIME_LIMIT) {
                  finish();
              } else {
                  mtimeOfFirstClick = System.currentTimeMillis();
              }
          }
          

          【讨论】:

          • 这里有一个错误:它必须是“System.currentTimeMillis()”而不是“System.currentTimeInMilliseconds()”。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-08
          相关资源
          最近更新 更多