更改方向后,Null意图返回到上一个Activity

时间:2012-08-16 23:05:07

标签: android orientation start-activity

我正面临这个奇怪的问题: 我正在使用startActivityForResult()传递给下一个Activity。在第二个Activity中,一切正常,直到我开始更改手机方向,这会在返回上一个Activity时导致一些问题..似乎返回的Intent null

我尝试使用onSaveInstanceState()/onRestoreInstanceState(),但无法让它发挥作用。

有什么想法吗?

更新

这是用于发送数据的代码,如果我不更改方向,则可以正常工作

// photosList is an ArrayList<String>
Intent resultIntent = new Intent();
resultIntent.putStringArrayListExtra("photos", photosList);
setResult(RESULT_OK, resultIntent);

4 个答案:

答案 0 :(得分:0)

根据您的活动的不同,您可能无需在方向更改时重新加载活动。您可以将其添加到AndroidManifest的相应<Activity>部分,以禁用重新加载:

android:configChanges="screenOrientation"

这实际上告诉设备您将自己处理配置更改,并且您可以通过回调来执行此操作,或者如果您不关心方向更改,则可以忽略它。

答案 1 :(得分:0)

好的,所以上面的答案在某种程度上有效,但你不应该在onStop上做你正在做的事情。您遇到的问题似乎来自于您需要保存从调用Activity获得的额外内容。我将假设您发送的内容永远不会真正改变,并且您可以期望它始终发送相同数量的附加内容,但动态数据包含在其中。

@Override
onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    Intent intent = getIntent();
    savedInstanceState.putStringArrayList("photos", intent.getStringArrayListExtra("some_string"));
}

然后在onCreate中,您可以执行以下操作:

onCreate(Bundle savedInstanceState) {
    /*I assume you got stuff places so just fit it in somewhere nice*/
    Intent resultIntent = new Intent();
    if(savedInstanceState == null) {
        //we know here that this is the first call to the second Activity
        //So you can just put the Intent that was sent since we know it came from the calling Activity with the original stuff
        resultIntent = getIntent();
    } else {
    resultIntent.putStringArrayListExtra("photos", bundle.getStringArrayListExtra());  
    }  
}

所以希望你明白我在那里做了什么。它本质上为您提供了一种方法,可以访问除了重新加载之外需要保留的任何内容。现在,如果方向问题从未存在过,那么您可以setResult(RESULT_OK, resultIntent);在任何地方进行{{1}}。因此,当你看到更少的代码必须覆盖你可能只需要的东西。如果有意义,请告诉我。哦,如果你这样做,不要添加任何东西来禁用方向:)

答案 2 :(得分:0)

我遇到了同样的问题。看来,如果您将结果代码设置为Activity.RESULT_OK( - 1),则在Android方向更改时会将其重置为0。因此,您必须重新创建意图并在某处重置结果代码(可能在重写的finish()方法中)。

答案 3 :(得分:0)

  

Android会在您更改方向时重新创建您的活动

这可能是您遇到的问题,尝试将数据存储到Shared Preference并在onCreate()方法中将值重新分配给您的变量。

您还可以尝试onsaveinstancestate()onrestoreinstancestate()方法来保存您的活动状态。