setResult()工作不正常

时间:2015-02-02 15:35:32

标签: android android-activity

我有两个活动:一个是启动器(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);
            }
        }
    }

2 个答案:

答案 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。