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

标签 javascript android android-intent

我有一个基于教程的通用应用程序,它将用户信息传递给第二个 Activity 。在第二个 Activity 中,用户通过复选框选择是否“同意”。当用户单击提交按钮时,他们应该返回到之前的 Activity ,并使用 SnackBar 确认他们是否选中了同意复选框。

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

<小时/>

令我非常困惑的是,如果我选择手机上的后退按钮,我就会返回到第一个 Activity 。最重要的是,它似乎仍然传递了使用 setResult() 设置的信息,不仅正确返回了预期的 requestCode,而且还正确返回了 intent 并确定 CheckBox 是否设置为 enabled==true

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

<小时/>

我的 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));
        }
    }
}

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

<小时/>

我的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);
}

事后看来,我意识到它一直都是这样做的。虽然“提交”按钮从未起作用,但在选择“提交”后,我始终能够使用“返回”返回到上一个 Activity 。仅在包含 setResult(RESULT_OK,intent); 之后,我的第一个 Activity 才对所需的选择使用react。另一个问题的答案表明这是一个要求。

我可以确认 setResultfinishActivity 仍然应用传递 resultCoderequestCodeintent 回到第一个 Activity 。我已经发现,选择提交后所做的任何“更改”都不会随后退按钮一起移动,除非我再次选择提交。

<小时/>

我已经完成了 Android Developers website 上的教程,并且他们为实现这一点提供了很大帮助;但是,对于 ConfirmActivity 一侧的代码,我所能找到的只是暗示我应该已经知道我在做什么。我相信the main tutorial I followed打算让第二个 Activity 来自外部源。

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

Thanks to another question ,我发现我可以在 finishActivity() 之后立即使用 onBackPressed() 来“编码”按后退按钮。考虑到这一点,一切似乎都按预期进行。然而,我认为这是一个不太理想的黑客行为。我更愿意了解为什么它没有按预期工作,以及我应该如何正确返回之前的 Activity 。

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

最佳答案

按照Tasos的建议,使用finish()而不是finishActivityint()did 实际上解决了我的问题。在某种程度上..

看来这个解决方案只在我关闭计算机、重新打开并执行项目重建之后才产生了影响。

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

  1. 尝试再次打开和关闭它
  2. 重建项目

我之前遇到过一些奇怪的问题,这些问题在重建时就自行解决了;但从来没有一个问题只有在系统完全重新启动后才能自行解决。

关于javascript - 除非在选择提交按钮后按下 BACK,否则 finishActivity() 不会起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38998595/

相关文章:

android - 为什么我的可搜索 Activity 的 Intent.getAction() 为空?

android - 为什么 css 属性在 android webview 中发生变化

Android Gallery 应用加载速度很慢

android - 支持注解@StringDef、@IntDef声明标准?

android - 如何使用 IntentsTestRule 和 launchFragmentInContainer 测试是否从 fragment 发送 Intent

以编程方式打开/关闭 Android 设备 GPS

javascript - 图层.删除(图像);无法在 Kinetic.js 中工作

javascript - 为什么 javascript 中不使用字符串循环的 C++ 语法?

javascript - 使用 Immutability helper js 更新对象数组中对象内的元素

javascript - 验证(按位)一个值是否与枚举的多个特定标志匹配