我有一个基于教程的通用应用程序,它将用户信息传递给第二个活动。在第二个活动中,用户选择是否通过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);
之后,我的第一项活动才对所需的选择作出反应。另一个问题的答案表明这是一项要求。
我可以确认setResult
和finishActivity
仍然适用将resultCode
,requestCode
和intent
传递回第一个活动的逻辑。我已经确定,选择提交后我做的任何“更改”都不会随后退按钮移动,除非我再次选择提交。
我已经阅读了Android Developers website上的教程,他们在这方面做出了相当大的贡献;但是,对于ConfirmActivity
方面的代码,我能找到的只是暗示我应该已经知道我在做什么。我相信the main tutorial I followed意图第二项活动来自外部来源。
我在StackExchange上找到了很多有用的信息;但是在许多类似的问题中,最终的答案似乎是finishActivity(int)
最终应该总是将我送回上一个活动。
Thanks to another question,我已经知道我可以在finishActivity()
onBackPressed()
之后立即按下后退按钮进行“编码”。考虑到这一点,一切似乎都按预期工作。但是,我认为这是一个不太理想的黑客攻击。我更愿意理解为什么它没有按预期工作,以及我应该如何正确地回到之前的活动。
这是finishActivity(int)
的正确实现吗?为什么我仍然需要点击手机上的“后退”按钮才能工作,我该如何解决这个问题呢?
答案 0 :(得分:0)
根据 Tasos 的建议,使用finish()
代替finishActivityint()
确实解决了我的问题。在某种程度上..
这个解决方案似乎只有 之后我关闭了我的计算机,重新打开它,和执行了我的项目的重建。
我相信这个可能 有些新的,因为它与我之前在StackOverflow上找到的高度投票的答案相矛盾。也就是说,如果其他人有类似这样的“愚蠢问题”;
我之前有过一些奇怪的问题,这些问题在重建时已经得到了解决;但从来没有一个问题只有在完成系统重启后才能解决。