6

我正在制作一个简单的绘图应用程序。

当设备方向改变时,我希望能够将用户的绘图保存在屏幕上。这只发生在主要活动中。

我读到如果方向发生变化,那么活动将被销毁并再次重新创建(onCreate(Bundle created)被调用)。我不确定这是否意味着它也应该调用onSavedInstanceState(Bundle bundle),因为在我的应用程序中,只有在另一个活动将焦点放在我的主要活动之上时才会调用它,而不是在旋转到横向/纵向时才调用。

我只是在寻找一种方法来保存现有位图并在方向改变时将其传递给主要活动。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()当我在设备上改变方向时会被调用。

4

5 回答 5

8

你应该完整阅读这篇文章

...您可能无法使用系统通过 onSaveInstanceState()回调为您保存的 Bundle 完全恢复您的活动状态——它不是为携带大对象(例如位图)而设计的,并且其中的数据必须被序列化然后反序列化,这会消耗大量内存并使配置更改变慢。在这种情况下,您可以通过在您的活动因配置更改而重新启动时保留一个有状态的对象来减轻重新初始化活动的负担。

在运行时配置更改期间保留对象:

  1. 覆盖该onRetainNonConfigurationInstance()方法以返回您想要保留的对象。
  2. 当您的活动再次创建时,调用getLastNonConfigurationInstance()以恢复您的对象。
于 2012-07-05T14:36:59.013 回答
6

我正在阅读 TheNewBoston 的 Android 教程https://thenewboston.com/

在第 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);
}

在课堂里。

这解决了位图消失的问题。

于 2013-02-07T12:18:15.767 回答
0

onConfigurationChanged() 方法可能是解决您的问题的最简单方法。它在方向切换之间保存应用程序的当前状态

这个链接有更多关于它的信息。

于 2012-07-05T15:54:36.340 回答
0

现在,您可以将数据存储在视图模型中,并在配置更改时保留它们。

于 2021-02-23T11:26:09.080 回答
-14

将您的位图保存在onPause()onDestroy()因为我认为onSavedInstanceState()在切换方向时不会被android系统调用。

于 2012-07-05T14:33:18.787 回答