Android - Finish()重启当前活动

时间:2012-10-20 20:44:42

标签: android android-activity

我有一个活动拒绝在第一次调用finish()时关闭。我最初在活动中放了一个取消按钮,但后来我注意到它在使用Back按钮时表现出相同的行为。它可以这样描述: 1.活动打开,填写相应的数据(来自上一个活动的列表视图)。 2.按“返回”按钮,清除所有字段的数据,但不会将用户返回到原始活动。 3.再次按“返回”按钮,用户将返回原始活动。

我可以发布代码,但我不确定问题是在当前活动还是主要活动中。我可以提一下,切换到使用上下文菜单打开Activity。

更新: 好的,看起来这两个建议都是正确的,主要活动确实是启动了2个版本的Edit活动。现在我只想弄明白为什么。当我切换到列表项选项的上下文菜单时,我注意到了这种情况。但是,“添加”按钮是菜单项。以下是相关代码:

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);

    // add(int groupId, int itemId, int order, int titleRes)
    menu.add(0, INSERT_ID, 0, R.string.menu_insert);
    menu.add(0, SETTINGS_ID, 1, R.string.sharedPrefButton);
    menu.add(0, COMMON_DESC_ID, 2, R.string.commonDescButton);
    menu.add(0, RESET_ID, 3, R.string.menu_reset);
    return true;
}

/*
 * This is going to handle the "Add Expenditure" menu item. When this is selected, the 
 * onOptionsItemSelected() method will be called with the item.getId() set to INSERT_ID 
 * (the constant we used to identify the menu item).
 */

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
    switch(item.getItemId()) {
        case INSERT_ID:
            createExpenditure();
            break;
        case SETTINGS_ID:
            manageSharedPrefs();
            break;
        case COMMON_DESC_ID:
            manageCommonDesc();
            break;
    }
    return super.onMenuItemSelected(featureId, item);
}

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.add(0, DELETE_ID, 0, R.string.menu_delete);
    menu.add(0, EDIT_ID, 0, R.string.menu_edit);
}

public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    int itemId = item.getItemId();
    switch(itemId) {

        case DELETE_ID: 
            mDbHelper.deleteExpenditure(info.id);
            fillData();
            break;

        case EDIT_ID: 
            Intent i = new Intent(this, ExpenditureEdit.class);
            i.putExtra(ExpendituresDbAdapter.KEY_ROWID, info.id);
            startActivityForResult(i, ACTIVITY_EDIT);
            break;
    }

    return super.onContextItemSelected(item);
}

2 个答案:

答案 0 :(得分:2)

您似乎两次启动相同的Activity。这是你的活动堆栈:

Original Activity, starts ListActivity
    ListActivity (no data in fields), starts another instance of itself
        ListActivity (fill in appropriate data)

现在当您按下后退按钮时:

        ListActivity, close this second instance but...
    ListActivity (still no data), the first instance resumes, so push back again
Original Activity

(没有代码我无法帮助你移动而不是描述我认为发生的事情......)

答案 1 :(得分:0)

这种情况正在发生,因为每当执行onContextItemSelected时都会调用onMenuItemSelected。虽然我仍然不确定为什么,如果我在onMenuItemSelected方法中使用条件,一切似乎都可以正常工作:

 @Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {

    if (featureId == Window.FEATURE_CONTEXT_MENU)
    {
        Log.i("EZBudget","Context Menu");
    }
    else if (featureId == Window.FEATURE_OPTIONS_PANEL)
    {
        switch(item.getItemId()) {
         case INSERT_ID:
             createExpenditure();
             break;
         case SETTINGS_ID:
            manageSharedPrefs();
            break;
         case COMMON_DESC_ID:
            manageCommonDesc();
            break;
        }

    }

    return super.onMenuItemSelected(featureId, item);
}

我在另一篇文章中找到了这个答案:onContextItemSelected doesn't get called