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

TheNewBostonhttps://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);
}

クラスで。

これにより、ビットマップが消えるという問題が解決しました。

于 2013-02-07T12:18:15.767 に答える
0

onConfigurationChanged() メソッドは、おそらく問題に対する最も簡単な解決策です。方向スイッチ間のアプリの現在の状態を保存します

このリンクには、それに関する詳細情報があります。

于 2012-07-05T15:54:36.340 に答える
0

これで、データをビュー モデルに保存し、構成の変更後も保持できるようになりました。

于 2021-02-23T11:26:09.080 に答える
-14

向きを切り替えるときにAndroidシステムによって呼び出されることはないと思うため、ビットマップをonPause()またはに保存します。onDestroy()onSavedInstanceState()

于 2012-07-05T14:33:18.787 に答える