我有两个活动:一个是启动器(Act1),另一个(Act2)允许用户更改应用程序设置(我使用首选项保存)。 Act1显示当前设置,用户可以从中打开Act2。现在,当用户打开Act2,更改设置并返回到Act1时,我希望Act1的UI相应地进行升级。但是,只有在更改设置时才会发生这种情况。
所以,我正在使用startActivityForResult()
在Act2中启动Act2和setResult()
,并在我编辑我的偏好的地方。代码如下:
Act1.java :
Intent m_intent = new Intent(getApplicationContext(), Act2.class);
startActivityForResult(m_intent, 1);
Act2.java :
final Intent m_intent = new Intent();
setResult(RESULT_OK, m_intent);
虽然仅在运行Moto G的5.0上运行,但这种方法效果很好。它不适用于我的Optimus One(自定义4.4.2)甚至2.3.3运行模拟器。
用户可以通过设备的后退按钮或小型的'返回到Act1。在UI中(调用finish())。由于其他原因,我也在Act2中压倒onBackPressed()
'。考虑到这些并在阅读了很多有关setResult()
无法工作的问题之后,我认为可能需要对活动状态做些什么。所以,我在Act2中试过这个:
@Override
public void finish() {
final Intent m_intent = new Intent();
setResult(RESULT_OK, m_intent);
super.finish();
}
并尝试在Act1中的onActivityResult()
中读取resultCode。它在5.0中返回RESULT_OK
,但在其他两台设备上仍然是RESULT_CANCELLED
。我似乎无法让Act2在我的旧手机或模拟器上返回RESULT_OK
!任何想法为什么会发生这种情况......?
编辑1: onActivityResult的代码
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("res", requestCode + " " + resultCode);
if (resultCode == RESULT_OK) {
can_proceed_click = false;
readPrefs(true);
// bat update
if (requestCode == 1) {
removeSmLayout(0);
animateIconToggle(0);
m_handler.postDelayed(new Runnable() {
@Override
public void run() {
makeBatSmIconLayout(false, false);
}
}, 500);
}
// saf update
else if (requestCode == 2) {
pass_entered = data.getBooleanExtra("pass_entered", false);
removeSmLayout(1);
animateIconToggle(1);
m_handler.postDelayed(new Runnable() {
@Override
public void run() {
makeSafSmIconLayout(false, false);
}
}, 500);
}
// low update
else if (requestCode == 3) {
removeSmLayout(2);
animateIconToggle(2);
m_handler.postDelayed(new Runnable() {
@Override
public void run() {
makeLowSmIconLayout(false, false);
}
}, 500);
}
}
}
答案 0 :(得分:0)
即使我看不到问题,你也可以做这样的解决方案:
@Override
public void finish() {
final Intent m_intent = new Intent();
m_intent.putExtra("EXPLICIT_RESULT_CODE", RESULT_OK);
setResult(RESULT_OK, m_intent);
super.finish();
}
并在活动A中:
if(data.getIntExtra("EXPLICIT_RESULT_CODE", RESULT_CANCELLED) == RESULT_OK) {
//Result is RESULT_OK
}
或者只是要格外小心,安全地对抗NullExceptions
if(data != null && data.getIntExtra("EXPLICIT_RESULT_CODE", RESULT_CANCELLED) == RESULT_OK) {
//Result is RESULT_OK
}
如您所见,这只是设置一个显式整数,并通过Intent
对象将其发回。
答案 1 :(得分:0)
如果有人偶然发现了这个,这对我来说是个问题:
如果设备的do not keep activity alive
选项为ON,则您的活动结果行为不正常,即,当您通过RESULT_OK(即-1)时,呼叫者(父母)活动将获得(0)是RESULT_ERROR
我确实将其关闭,并且setResult现在可以再次按预期工作。
p.s
do not keep activity alive
选项可在开发人员选项下的设置中找到。默认值默认设置为OFF。