Android覆盖后退按钮

时间:2012-03-08 19:49:33

标签: android back

我在Activity1中有一个(自定义)列表视图。当我单击一行时,Activity2将打开另一个(自定义)列表视图。在两个列表视图的行中有几个对象:imageview,checkbox,textview 当我将所有复选框设置为在activity2中选中,然后单击手机的BACK按钮时,应检查列表视图中相应行的复选框。但是,当我单击BACK按钮时,没有任何反应(检查Logcat,没有新行,没有日志,没有) 所以我认为我覆盖了BACK按钮,所以当我点击它时,Activity1应该打开。

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
      Intent intentstart = new Intent(Activity2.this, Activity1.class);
      startActivity(intentstart);
      return true;
    }
    return super.onKeyDown(keyCode, event);    
 }

这有效,但我有顾忌。这是一个好的解决方案吗?有更好的解决方案吗? 因为这会扼杀BACK btn的正常行为。

正常行为:

  1. 活动1打开。我点击了一行 - > Activity2打开。我点击后退 - >我看到Activity1。我点击了一行 - > Activity2打开.......玩了几分钟后我在Activity1,我点击回来,我在我的应用程序的开放屏幕上。
  2. NEW BEHAVIOR:

    1. 活动1打开。我点击了一行 - > Activity2打开。我点击后退 - >我看到Activity1。我点击了一行 - > Activity2打开.......玩了几分钟后我在Activity1,我点击后退,Activity2打开。然后再返回 - > Activity1打开。然后再返回 - > Activity2打开,依此类推,直到我回滚所有先前打开的活动。

2 个答案:

答案 0 :(得分:0)

Intent intentstart = new Intent(Activity2.this, Activity1.class);
intentstart.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intentstart);

此标志将删除已打开的活动。

例如,考虑一个由活动组成的任务:A,B,C,D。如果D调用带有解析为活动B组件的Intent的startActivity(),那么C和D将完成并且B接收给定的Intent,导致堆栈现在为:A,B。

如果要检查activity2上的复选框,请在返回时检查activity1。 你应该使用

startActivityForResult(intent, requestCode);//when start new activity

Intent resultIntent = new Intent(); // when finish activity2
resultIntent.putExtra("selected", selected); //send checked data to activity1
setResult(Activity.RESULT_OK, resultIntent);
finish();

然后覆盖onActivityResult()以选中复选框

P.S。按下后退按钮时,您可以覆盖onBackPressed()以执行操作。

答案 1 :(得分:0)

您需要做的是使用startActivityForResult()开始活动。这样您就可以覆盖onActivityResult()。只需在获得结果时刷新数据视图即可。

此外,我总是发现用户不可避免地要求我提供“保存”按钮以肯定确认操作并使用返回取消操作。