Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在不丢失父活动的情况下打开新活动_Java_Android_Android Intent - Fatal编程技术网

Java 在不丢失父活动的情况下打开新活动

Java 在不丢失父活动的情况下打开新活动,java,android,android-intent,Java,Android,Android Intent,我有一个DetailsActivity,它列出了一些图像的缩略图。我想通过将URL作为字符串传递到“FullScreenActivity”打开一个新活动,该活动允许用户查看图像的更大版本 DetailsActivity包含一个复杂的数据对象,我不想在用户打开全屏视图时丢失它 我可以将字符串传递到新的“FullScreenActivity”,下载图像,并可以收缩/缩放图像等。。但当我单击向上按钮返回DetailsCitivity时,应用程序崩溃,因为复杂的数据对象消失了 当用户查看更大的图像时,如

我有一个DetailsActivity,它列出了一些图像的缩略图。我想通过将URL作为字符串传递到“FullScreenActivity”打开一个新活动,该活动允许用户查看图像的更大版本

DetailsActivity包含一个复杂的数据对象,我不想在用户打开全屏视图时丢失它

我可以将字符串传递到新的“FullScreenActivity”,下载图像,并可以收缩/缩放图像等。。但当我单击向上按钮返回DetailsCitivity时,应用程序崩溃,因为复杂的数据对象消失了

当用户查看更大的图像时,如何保持DetailsActivity

下面是我如何称呼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);
}
});
在我的全屏活动中,我通过

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的解决方案