当应用程序 stopped/device 关闭时,在 android 上保存片段 state/data
save fragment state/data on android when app stopped/device turned off
我正在寻找一种方法让我的片段 "resume" 成为我关闭设备之前的状态(因为我已经将图像保存到其中)。我看到是什么导致了错误,但找不到解决方案(当您第一次打开 App/Fragment 已加载时,关于如何处理 OnCreate 的类似问题似乎没有得到回答)。
当我打开我的应用程序时,它会在我的 Main Activity:
上创建新的 Fragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.container, new HomeFragment(),"Home_Fragment")
.addToBackStack("Home_Fragment").commit();
FragmentTransaction bin = getSupportFragmentManager().beginTransaction();
bin.replace(R.id.my_image_container, new MyImageFragment(), "banner").commit();
// Listening for image to be sent over
RepeatTask();
}
现在我已经设法让我的片段在片段之间切换时保存所有数据,如下面的片段 java 文件所示:
HomeFragment hm = (HomeFragment)myContext.getSupportFragmentManager().findFragmentByTag("Home_Fragment");
FragmentTransaction ft = myContext.getSupportFragmentManager().beginTransaction();
ft.replace(R.id.container, hm, "Home_Fragment").commit();
但是当我离开应用程序时,这意味着我要么永久停止它,要么关闭我的 phone 并重新打开它,所有数据(图像)都消失了,这是有道理的,因为我的 Main Activity 重新启动它。 你们中有人知道我如何让我的 MainActivity 不是每次打开应用程序时都启动一个新的片段,而是 "resume" 我保存图像的旧状态是我从我的计算机通过 TCP
尝试保存片段实例状态实际上是一种不好的做法。
Android 有自己的处理方式。
当您想保存从网页下载的一些数据并且不想在重新打开应用程序时再次下载该内容时,您需要将数据保存在已知位置。
这种事情的解决方案是(磁盘)缓存或 sqlite 数据库。当您需要保存的数据是图像时,最好的保存方式是磁盘缓存。
好吧,如果按钮是根据图像动态加载的。您可以通过图像循环读取缓存并为每个图像创建一个按钮。
http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html
如果需要保存更多属性,我会考虑使用 sqlite 数据库(结合缓存)
sqlite 数据库可以保存许多数据类型,如数字、tekst、日期和二进制格式数据。
图像可以保存为(base 64)二进制字符串。但是从数据库加载二进制字符串比缓存慢。
在此处阅读有关数据库的更多信息:
http://developer.android.com/training/basics/data-storage/databases.html
两个链接都包含示例。
另外一个我想给你的小提示是尽量只保存真正需要的东西,不要更多。
不要试图保存 ui 东西。
并尽可能抽象地保存数据。
学习数据库规范化将使您对此有更好的了解。
我正在寻找一种方法让我的片段 "resume" 成为我关闭设备之前的状态(因为我已经将图像保存到其中)。我看到是什么导致了错误,但找不到解决方案(当您第一次打开 App/Fragment 已加载时,关于如何处理 OnCreate 的类似问题似乎没有得到回答)。 当我打开我的应用程序时,它会在我的 Main Activity:
上创建新的 Fragment@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.container, new HomeFragment(),"Home_Fragment")
.addToBackStack("Home_Fragment").commit();
FragmentTransaction bin = getSupportFragmentManager().beginTransaction();
bin.replace(R.id.my_image_container, new MyImageFragment(), "banner").commit();
// Listening for image to be sent over
RepeatTask();
}
现在我已经设法让我的片段在片段之间切换时保存所有数据,如下面的片段 java 文件所示:
HomeFragment hm = (HomeFragment)myContext.getSupportFragmentManager().findFragmentByTag("Home_Fragment");
FragmentTransaction ft = myContext.getSupportFragmentManager().beginTransaction();
ft.replace(R.id.container, hm, "Home_Fragment").commit();
但是当我离开应用程序时,这意味着我要么永久停止它,要么关闭我的 phone 并重新打开它,所有数据(图像)都消失了,这是有道理的,因为我的 Main Activity 重新启动它。 你们中有人知道我如何让我的 MainActivity 不是每次打开应用程序时都启动一个新的片段,而是 "resume" 我保存图像的旧状态是我从我的计算机通过 TCP
尝试保存片段实例状态实际上是一种不好的做法。 Android 有自己的处理方式。
当您想保存从网页下载的一些数据并且不想在重新打开应用程序时再次下载该内容时,您需要将数据保存在已知位置。 这种事情的解决方案是(磁盘)缓存或 sqlite 数据库。当您需要保存的数据是图像时,最好的保存方式是磁盘缓存。
好吧,如果按钮是根据图像动态加载的。您可以通过图像循环读取缓存并为每个图像创建一个按钮。
http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html
如果需要保存更多属性,我会考虑使用 sqlite 数据库(结合缓存) sqlite 数据库可以保存许多数据类型,如数字、tekst、日期和二进制格式数据。 图像可以保存为(base 64)二进制字符串。但是从数据库加载二进制字符串比缓存慢。
在此处阅读有关数据库的更多信息: http://developer.android.com/training/basics/data-storage/databases.html
两个链接都包含示例。
另外一个我想给你的小提示是尽量只保存真正需要的东西,不要更多。 不要试图保存 ui 东西。 并尽可能抽象地保存数据。
学习数据库规范化将使您对此有更好的了解。