【问题标题】:Application asking twice to exit with onBackPressed()应用程序要求两次退出 onBackPressed()
【发布时间】:2014-09-30 05:24:15
【问题描述】:

我已使用以下方法通过向用户提示警报框来退出应用程序。
但我的应用程序要求 2 次离开。

代码:

    @Override
    public void onBackPressed()
    {
        new AlertDialog.Builder(this)
        .setTitle("Closing Activity")
        .setMessage("Are you sure you want to close this activity?")
        .setPositiveButton("Yes", new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finish();    
                }
            })
        .setNegativeButton("No", null)
        .show();
    }

【问题讨论】:

  • 你有Overridefinish()的方法吗?另外,我会说这是一个坏主意,恕我直言,除非绝对必要,例如保存数据
  • 你也覆盖了 onkeydown 吗?
  • 给出你的整个活动或显示你是否覆盖了destroy()或finish()方法
  • 每当您打开对话框时打印一个堆栈跟踪,以查看导致它每次触发的原因。顺便说一句,同意codeMagic - 我会安装一个应用程序,当我按下后退按钮时会提示我。是的,我想关闭活动,这就是我按下后退按钮的原因!
  • 我必须使用一个应用程序询问我是否要退出。我讨厌它!如果我不想退出,我就不会反抗。只是不要这样做。这是反移动和 Android 应用程序设计。

标签: android


【解决方案1】:

这可能是几件事的结果:

  1. 您还覆盖了void onKeyDown(...)void dispatchKeyEvent(...) 并在那里拨打onBackPressed();

  2. 你已经覆盖了void finish()
    然后你调用第二个对话框

  3. 您的应用被实例化了 2 次
    (出于任何原因——查看您的代码?)

  4. 你故意两次打开你的活动,然后我在这里修复:)
    用这段代码替换你的代码来打开它:

    Intent intent = new Intent(this, yourSubActivityClass.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
    

    来自文档:

    如果设置了,并且正在启动的 Activity 已经在当前任务中运行,那么不会启动该 Activity 的新实例,而是关闭它之上的所有其他 Activity,并且此 Intent 将被传递到(现在在顶部)作为新 Intent 的旧活动。

  5. 如果其中一些对您有帮助,请在 cmets 中告诉我
    否则发布更多代码,我会尽力为您提供更多帮助;)

【讨论】:

  • 谢谢@Schnizel1337 它有效我从 OnBackPressed 方法中删除了 Override 并清除了顶部。现在可以正常使用了..非常感谢...!!!!
  • 没问题,那么你可以通过左边的按钮接受我的回答,让其他人看到它是正确的:)
【解决方案2】:
//I use this : 

public class MyActivity extends Activity
    {
    private int BackPressedCount=0; //press count

    private void StartTimer()
        {
        TimerTask TT=new TimerTask() 
            {
            @Override
            public void run() 
                {
                try
                    {
                    //if second press not detect in 1 second,reset and stop timer
                    BackPressedCount=0; 
                    this.cancel();
                    }
                catch(Exception E)
                    {
                    }
                }
            };
        new Timer().scheduleAtFixedRate(TT, 1000, 1000);// init timer for 1 second period
        }

    @Override
    public void onBackPressed() 
        {
        //super.onBackPressed();

        BackPressedCount++; //every press

        if(BackPressedCount==1) // if first press detect run Timer (wait for second press)
            StartTimer();

        if(BackPressedCount==2) // if second press detect then finish
            finish();   

        Toast.makeText(getBaseContext(),"Press again to exit" ,Toast.LENGTH_SHORT).show();
        }

    }

【讨论】:

  • 您能否添加一些解释或 cmets 以帮助澄清您的答案?
猜你喜欢
  • 2012-05-12
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多