打开新活动而不丢失父活动

siv3szwd  于 2021-07-13  发布在  Java
关注(0)|答案(4)|浏览(280)

我有一个detailsactivity,它列出了一些图像的缩略图。我想打开一个新的活动,将url作为字符串传递给一个“fullscreenavity”,允许用户查看图像的更大版本。
detailsactivity包含一个复杂的数据对象,我不想在用户打开全屏视图时丢失它。
我可以将字符串传递给新的“fullscreenactivity”,下载图像,并可以收缩/缩放图像等。。但当我单击向上按钮返回DetailsCitivity时,应用程序崩溃了,因为复杂的数据对象消失了。
当用户看到更大的图像时,如何保持细节活动?
以下是我如何称之为fullscreenactivity。这在for循环中调用,该循环创建新的图像视图并将其添加到活动中。

image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(DetailsActivity.this, ViewFullPhotoActivity.class);
intent.putExtra("FullScreenPicture", (String) finalImageMap.get("MainImage"));
startActivity(intent);
}
});

在我的fullscreenactivity中,我通过

String fullScreenImage = (String) getIntent().getCharSequenceExtra("FullScreenPicture");

我曾尝试过打包复杂的数据对象并将其与新的意图一起发送,但这肯定不是最佳实践。如果我走这条路,还有其他一些事情对用户来说不是很好,特别是重新下载所有缩略图,或者丢失表单中输入的数据。

sq1bmfud

sq1bmfud1#

我建议你取消 onSaveInstanceState() ,将数据保存在那里和里面 onCreate() 从中获取保存的数据 savedInstanceState . 有关更多信息,请参阅文档。

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    // Save your data here with savedInstanceState.put<something>...
}

如果您的数据很复杂(不是字符串、int或简单类型),您可以编写一个方法将其保存到 Bundle (什么可以放在 savedInstanceState bundle),以及另一个解析bundle并从中恢复数据的包)。但是存储这样的图像不是个好主意。。。你可以将它们缓存在SD卡上(例如在你的应用程序的数据目录中,但不能在内存中)。
另一个选项是在全屏对话框中显示“fullscreenactivity”的内容,而不是活动,这样detailsactivity就不会在后台被破坏。

mrwjdhj3

mrwjdhj32#

如果无法使用保存复杂的数据结构 onSaveInstanceState ,则最简单的方法是将其保存在单个对象中,然后将复杂对象保存在内存中。你可以在这里找到一个例子。
然而,这不是最好的方法。如果假设复杂对象一直在内存中,则可能会遇到意外的空指针异常。如果你想走得更远,那么你可以
序列化对象并将其保存到磁盘
使用sqlite数据库并将其保存在数据库中
我相信后两种方法更好,但是需要一些重要的工作,这取决于您的数据结构有多复杂。

wfsdck30

wfsdck303#

这样就可以了。在你的清单文件里。

<activity
            android:name=".FullScreenActivity"
            android:label="FullScreenActivity"
            android:launchMode="singleTop"
            android:parentActivityName=".DetailsActivity">

这将指定您的全屏活动将是detailsactivity的子活动。因此,这将在detailsactivity上打开全屏活动。

lymnna71

lymnna714#

我找到了一个简单得多的解决办法。在我的android清单中,在我的detailsactivity中我简单地添加了 android:launchMode="singleTop" . 成功了。

相关问题