Java 在不丢失父活动的情况下打开新活动
我有一个DetailsActivity,它列出了一些图像的缩略图。我想通过将URL作为字符串传递到“FullScreenActivity”打开一个新活动,该活动允许用户查看图像的更大版本 DetailsActivity包含一个复杂的数据对象,我不想在用户打开全屏视图时丢失它 我可以将字符串传递到新的“FullScreenActivity”,下载图像,并可以收缩/缩放图像等。。但当我单击向上按钮返回DetailsCitivity时,应用程序崩溃,因为复杂的数据对象消失了 当用户查看更大的图像时,如何保持DetailsActivity 下面是我如何称呼FullScreenActivity的。这在for循环中调用,该循环创建新的图像视图并将其添加到活动中Java 在不丢失父活动的情况下打开新活动,java,android,android-intent,Java,Android,Android Intent,我有一个DetailsActivity,它列出了一些图像的缩略图。我想通过将URL作为字符串传递到“FullScreenActivity”打开一个新活动,该活动允许用户查看图像的更大版本 DetailsActivity包含一个复杂的数据对象,我不想在用户打开全屏视图时丢失它 我可以将字符串传递到新的“FullScreenActivity”,下载图像,并可以收缩/缩放图像等。。但当我单击向上按钮返回DetailsCitivity时,应用程序崩溃,因为复杂的数据对象消失了 当用户查看更大的图像时,如
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);
}
});
在我的全屏活动中,我通过
String fullScreenImage = (String) getIntent().getCharSequenceExtra("FullScreenPicture");
我曾想过打包复杂的数据对象并将其与新的意图一起发送,但这肯定不是最佳实践。如果我走这条路,还有其他一些对用户不好的事情,特别是重新下载所有缩略图,或者丢失表单中输入的数据。我建议覆盖
onSaveInstanceState()
,将数据保存在那里和onCreate()中
从savedInstanceState
获取保存的数据。有关更多信息,请参阅
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
// Save your data here with savedInstanceState.put<something>...
}
@覆盖
SaveInstanceState上的公共无效(Bundle savedInstanceState){
super.onSaveInstanceState(savedInstanceState);
//使用savedInstanceState在此处保存数据。将。。。
}
如果您的数据很复杂(不是字符串或int或某种简单类型),您可以编写一个方法将其保存到捆绑包中(可以放入savedInstanceState
捆绑包中的内容),以及另一个解析捆绑包并从中恢复数据的方法)。但是像这样存储图像不是一个好主意。。。您可以将它们缓存在SD卡上(例如在应用程序的数据目录中,但不在内存中)。
另一个选项是在全屏对话框中显示“FullScreenActivity”的内容,而不是活动,这样细节活动就不会在后台被破坏。如果无法使用onSaveInstanceState
保存复杂的数据结构,然后,最简单的方法是将其保存在单一对象中,然后将复杂对象保存在内存中。你可以找到一个例子
然而,这并不是最好的方法。如果假设复杂对象始终在内存中,则可能会遇到意外的空指针异常。如果你想走得更远,你可以
- 序列化对象并将其保存到磁盘
- 使用SQLite数据库并将其保存在数据库中
我相信后两种方法更好,但需要做一些重要的工作,这取决于数据结构的复杂程度 这样就可以了。
在您的清单文件中
<activity
android:name=".FullScreenActivity"
android:label="FullScreenActivity"
android:launchMode="singleTop"
android:parentActivityName=".DetailsActivity">
这将指定您的全屏活动将是DetailsActivity的子活动。因此,这将在DetailsActivity上打开全屏活动 我找到了一个更简单的解决方案。在我的android清单中,在我的DetailsActivity中,我只是添加了android:launchMode=“singleTop”
。这就成功了。当你的应用程序崩溃时,你能提供日志吗?所以我们可以检查原因。崩溃日志是因为复杂对象为空。我想你可能有相反的想法。我在“详细信息”活动中使用了启动模式,这很有效。您在活动中要求儿童、家长概念,这就是为什么我添加了一个类似@Firemarble的解决方案