我有一个基于教程的通用应用程序,它将用户信息传递给第二个 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。另一个问题的答案表明这是一个要求。
我可以确认 setResult
和 finishActivity
仍然应用传递 resultCode
、requestCode
和 intent
回到第一个 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 上找到的高票答案相矛盾。也就是说,如果其他人也有类似的“愚蠢问题”;
- 尝试再次打开和关闭它
- 重建项目
我之前遇到过一些奇怪的问题,这些问题在重建时就自行解决了;但从来没有一个问题只有在系统完全重新启动后才能自行解决。
关于javascript - 除非在选择提交按钮后按下 BACK,否则 finishActivity() 不会起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38998595/