2012-03-08 132 views
1

我有一个Activity1中的(自定义)列表视图。当我点击一行时,Activity2以另一个(自定义)列表视图打开。在两个列表视图的行中都有一些对象:imageview,复选框,textview。
当我将所有复选框设置为在activity2中选中时,并单击我手机的BACK按钮时,应检查listview中相应行的复选框。但是,当我点击BACK按钮时,没有任何反应(检查Logcat,没有新行,没有日志,没有任何事)。
所以我想我重写BACK按钮,所以当我点击它时,Activity1应该打开。Android重载后退按钮

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,我点击回来,我在我的应用程序的打开屏幕。

新行为:

  1. 活动1打开。我点击一行 - > Activity2打开。我点击返回 - >我看到Activity1。我点击一行 - > Activity2打开.......打了几分钟后,我在Activity1,我点击回来,打开Activity2。然后再回来 - > Activity1打开。然后再回来 - > Activity2打开等等,直到我回滚所有以前打开的活动。

回答

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

此标志将删除开业活动。

例如,考虑由以下活动组成的任务:A,B,C,D。如果D调用startActivity()并解析为活动B的组件,则C和D将完成,B接收给定的意图,导致堆栈现在为: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()检查复选框

附:当按下“后退”按钮时,您可以覆盖onBackPressed()进行操作。

+0

谢谢!工作和解释清楚! – erdomester 2012-03-08 20:26:16

+0

我正在使用sqlite并循环检查复选框的状态。你写的东西可能会更容易,但一旦它正在工作,我不想修改我的代码:) – erdomester 2012-03-08 20:35:06

0

您需要做的是使用startActivityForResult()开始活动。这将允许您覆盖onActivityResult()。获得结果时只需刷新数据视图。

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