除非在选择提交按钮后按下BACK,否则finishActivity()不起作用

时间:2016-08-17 13:51:01

标签: javascript android android-intent

我有一个基于教程的通用应用程序,它将用户信息传递给第二个活动。在第二个活动中,用户选择是否通过CheckBox“同意”。当用户点击提交按钮时,他们假设返回上一个活动,SnackBar确认他们是否检查了同意CheckBox。

问题是,第二个活动的提交按钮似乎无法正常运行。它使用finishActivity(int)方法,但没有任何反应。

让我感到非常困惑的是,如果我再选择手机上的后退按钮,我将返回第一个活动。最重要的是,它似乎仍然传递了setResult()的信息集,并且不仅正确地返回了预期的requestCode,而且还正确地返回intent并确定是否设置了CheckBox到enabled==true或不。{/ p>

如果我没有先单击提交按钮,则不会发生这种情况。如果我按下第二个活动的后退按钮,而不先按下提交按钮,应用程序将关闭。

我的MainActivity上的提交按钮启动MoveToConfirmationActivity方法:

/** Moves us to the second activity, the Confirmation Activity */
public void MoveToConfirmationActivity(View view) {

    Intent intent = new Intent(this, ConfirmActivity.class);

    intent.putExtra(REQUEST_CONFIRMATION, REQUEST_CONFIRMATION_INT);

    startActivityForResult(intent, REQUEST_CONFIRMATION_INT);
}

我还覆盖了onActivityResult(int, int, Intent),如下所示:

/** Runs when this activity is returned to by another activity */
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == REQUEST_CONFIRMATION_INT) {
        // Retrieve the accepted flag from the Confirm Activity, with the default as false.
        boolean accepted = data.getBooleanExtra(ConfirmActivity.AGREE, false);

        if(accepted) {
            SnackbarToast(getString(R.string.agree));
        }
        else {
            SnackbarToast(getString(R.string.disagree));
        }
    }
}

为清楚起见,我没有requestCode设置在onActivityResult()之外的地方,因为它误解了自己的价值。

我的ConfirmActivity上的提交按钮启动StartReturnToMainActivity方法:

/** Creates an intent to pass the checkbox value, and returns us to MainActivity. */
public void StartReturnToMainActivity(View view) {

    Intent intent = new Intent(this, MainActivity.class);
    intent.putExtra(AGREE, mAgreeCheckbox.isChecked());

    setResult(RESULT_OK, intent);
    finishActivity(mMainRequestInt);
}

事后来看,我意识到它一直都是这样做的。虽然提交按钮从未起作用,但在选择提交后,我始终可以使用Back返回上一个活动。只有在包括setResult(RESULT_OK, intent);之后,我的第一项活动才对所需的选择作出反应。另一个问题的答案表明这是一项要求。

我可以确认setResultfinishActivity仍然适用将resultCoderequestCodeintent传递回第一个活动的逻辑。我已经确定,选择提交后我做的任何“更改”都不会随后退按钮移动,除非我再次选择提交。

我已经阅读了Android Developers website上的教程,他们在这方面做出了相当大的贡献;但是,对于ConfirmActivity方面的代码,我能找到的只是暗示我应该已经知道我在做什么。我相信the main tutorial I followed意图第二项活动来自外部来源。

我在StackExchange上找到了很多有用的信息;但是在许多类似的问题中,最终的答案似乎是finishActivity(int)最终应该总是将我送回上一个活动。

Thanks to another question,我已经知道我可以在finishActivity() onBackPressed()之后立即按下后退按钮进行“编码”。考虑到这一点,一切似乎都按预期工作。但是,我认为这是一个不太理想的黑客攻击。我更愿意理解为什么它没有按预期工作,以及我应该如何正确地回到之前的活动。

这是finishActivity(int)的正确实现吗?为什么我仍然需要点击手机上的“后退”按钮才能工作,我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:0)

根据 Tasos 的建议,使用finish()代替finishActivityint() 确实解决了我的问题。在某种程度上..

这个解决方案似乎只有 之后我关闭了我的计算机,重新打开它,执行了我的项目的重建。

我相信这个可能 有些新的,因为它与我之前在StackOverflow上找到的高度投票的答案相矛盾。也就是说,如果其他人有类似这样的“愚蠢问题”;

  1. 尝试重新打开和关闭
  2. 重建项目
  3. 我之前有过一些奇怪的问题,这些问题在重建时已经得到了解决;但从来没有一个问题只有在完成系统重启后才能解决。