我正在制作一个简单的绘图应用程序。
我希望能够在设备方向改变时将用户的绘图保存在屏幕上。这只发生在主要活动中。
我读到如果方向发生变化,则会销毁活动并再次重新创建(onCreate(Bundle created)
被调用)。
我不确定它是否也应该调用onSavedInstanceState(Bundle bundle)
,因为在我的应用程序中,只有在另一个活动将焦点放在我的主要活动之上时才会调用它,而不是在旋转到横向/纵向时。 / p>
我只是在寻找一种方法来保存现有的位图,并在方向发生变化时将其传递给主要活动。如果我的onSaveInstanceState
永远不会被调用,我怎么能这样做?
此外,由于Bitmap已实现parceable
,我已经使用过它。
以下是主要活动的代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// some more activity code...
if (savedInstanceState != null) {
bitmap = savedInstanceState.getParcelable("bitmap");
Log.d("STATE-RESTORE", "bitmap created");
paintBoard.setBitmapBackground(bitmap, false);
Log.d("RESTORING...", "onRestoreInstanceState()");
} else {
Log.d("SavedInstanceState", "null");
}
}
// Never called when I change orientation on my device
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
bitmap = Bitmap.createBitmap(paintBoard.getBitmap());
outState.putParcelable("bitmap", bitmap);
Log.d("STATE-SAVE", "onSaveInstanceState()");
}
任何帮助将不胜感激。
编辑:
我从AndroidManifest.xml文件中删除了这一行:
android:configChanges="orientation"
当我在设备上更改方向时,现在onSaveInstanceState()
会被调用。
答案 0 :(得分:7)
您应该完全阅读this article。
...你可能无法完全恢复你的生命 具有Bundle的活动状态,系统为您保存
onSaveInstanceState()
回调 - 它不是为了携带大号而设计的 对象(如位图)及其中的数据必须序列化 然后反序列化,这可以消耗大量的内存并使其成为 配置变化缓慢。在这种情况下,你可以缓解 通过保留有状态对象来重新初始化您的活动的负担 当您的活动因配置更改而重新启动时。在运行时配置更改期间保留对象:
- 覆盖
onRetainNonConfigurationInstance()
方法以返回 你想保留的对象。- 再次创建活动时, 致电
醇>getLastNonConfigurationInstance()
以恢复您的对象。
答案 1 :(得分:5)
我正在浏览TheNewBoston https://thenewboston.com/
的Android教程在第4部分中,Travis引导我们制作了一个可以将图片设置为壁纸的相机应用程序。旋转位图消失的问题没有得到解决,但他只提供了android:configChanges="orientation"
解决方案,它暂时阻止了屏幕旋转。
使用此页面中的信息,我添加了
if (savedInstanceState != null) {
bmp = savedInstanceState.getParcelable("bitmap");
iv.setImageBitmap(bmp);
}
在onCreate
的末尾并添加了此覆盖
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("bitmap", bmp);
}
在课堂上。
这解决了位图消失的问题。
答案 2 :(得分:0)
onConfigurationChanged()方法可能是解决您问题的最简单方法。 它可以在方向开关之间保存应用程序当前状态
此link有更多相关信息。
答案 3 :(得分:0)
现在,您可以将数据存储在视图模型中,并在配置更改时保留它们。
答案 4 :(得分:-11)
将您的位图保存在onPause()
或onDestroy()
中,因为我认为在切换方向时,android系统永远不会调用onSavedInstanceState()
。