由于屏幕旋转,导致无法调用onActivityResult的解决方法

8

我有两个名为'First'和'Second'的活动

当我在第一个活动中调用startActivityForResult()方法时,将进入第二个活动并获取一些数据后返回。

如果第二个活动的方向发生变化,则在获取数据后不会调用onActivityResult()方法。

它会调用onCreate()函数。

我该怎么做才能保存从第二个活动获取的数据,即使我更改了屏幕方向也能调用onActivityResult()方法?


1
如果有任何人在理解问题方面遇到问题,请提出。 - user2498588
你应该在onPause()中保存所需的任何值,并在onResume()中恢复它。屏幕方向更改只是需要这样做的许多原因之一。 - Simon
@Simon,我应该如何保存从第二个活动获取的数据? - user2498588
1
在onPause()中将其保存到SharedPreferences(例如),然后在onResume()中检索它。当您想将值返回给第一个活动时,请调用setResult(),然后finish()。 - Simon
在方向更改后,它仍应调用onActivityResult。您需要向我们展示一个代码示例。 - Blundell
与发帖者遇到了相同的问题。 - Jeffrey Blattman
3个回答

0
在你的应用程序清单文件中,你是否记得声明你的First活动是Second活动的父级活动?像这样的格式:
<activity android:name=".Second"
          android:parentActivityName=".First">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".First"/>
</activity>

因为如果你这样做,即使在调用Second中的finish()时,屏幕方向不同,First也应该调用onActivityResult()

0

我也遇到了同样的问题,最简单的方法是将结果写入savedInstanceState。下面的示例仅设置Activity.RESULT_OK,但它很容易适用于任何可包裹/序列化对象:

var setResult: Boolean = false

override fun onSaveInstanceState(outState: Bundle) {
    if (setResult) outState.putBoolean("saved_state_key", true)
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    savedInstanceState?.getBoolean("saved_state_key")?.let {
        requireActivity().setResult(Activity.RESULT_OK)
    }
}
      

如果您正在使用viewModels,那么您不需要将其写入savedInstanceState中,在这种情况下,只需在onCreate中检查savedInstanceState是否不为null(这意味着片段/活动已被重新创建)。

-5
当屏幕方向改变时,应用程序会重新加载自身,这意味着它正在重新启动。
您可以通过将该行添加到Activity声明中,在AndroidManifest.xml中阻止屏幕方向更改:
android:orientation="portrait"

或者如果你想要横向方向:

android:orientation="landscape"

我不想修正方向。 - user2498588

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接