11

LinearLayoutを拡張するカスタムビューがあります。現在のビューステートを保存するためにonSaveInstanceState()とonRestoreInstanceState()を実装しました。ただし、アクションは実行されません。これらの2つのメソッドの中にログを配置すると、LogCatにも何も表示されません。これらの2つのメソッドは呼び出されていないと思います。誰かが問題がどこにあるか説明できますか?ありがとう。

@Override
public Parcelable onSaveInstanceState() {
    Bundle bundle = new Bundle();
    bundle.putParcelable("instanceState", super.onSaveInstanceState());
    bundle.putInt("currentPage", currentPage);
    return bundle;
}

@Override
public void onRestoreInstanceState(Parcelable state) {

    if (state instanceof Bundle) {
      Bundle bundle = (Bundle) state;
      currentPage = bundle.getInt("currentPage");
      Log.d("State", currentPage + "");
      super.onRestoreInstanceState(bundle.getParcelable("instanceState"));
      return;
    }
       super.onRestoreInstanceState(state);
  }
4

2 に答える 2

4

アンドロイドOSを掘り下げた後、私はついにそれを理解しました。私が疑ったように:これらの2つの方法には何の問題もありません。彼らはただ呼ばれていません。Webでは、「アクティビティが再作成されたときにonRestoreInsatnceStateが呼び出される」と読むことができます。わかりました。それは意味がありますが、完全に正しいわけではありません。はい、onRestoreInstanceState()は、アクティビティが再作成されたときに呼び出されますが、次の場合にのみ呼び出されます。

それはOSによって殺されました。「このような状況は、次の場合に発生します。

  • デバイスの向きが変わります(アクティビティが破棄されて再作成されます)
  • あなたの前に別のアクティビティがあり、ある時点でOSはメモリを解放するためにあなたのアクティビティを強制終了します(たとえば)。次回アクティビティを開始すると、onRestoreInstanceState()が呼び出されます。」

したがって、アクティビティ中にデバイスの[戻る]ボタンを押すと、アクティビティが終了し、次にアプリを起動したときに再度開始されます(再作成されたように聞こえますが、そうではありませんか?)。戻るボタンを押したときに意図的に終了したため、保存された状態はありません。

于 2012-09-09T01:15:58.977 に答える
4

Steven Byleのコメントで述べたように、カスタムを呼び出すには、カスタムViewにIDを割り当てる必要がありonSaveInstanceStateます。Viewこれは、カスタムコンストラクターでIDを設定することで実現しました。

public class BoxDrawingView extends View {
    private int BOX_DRAWING_ID = 555;
    …

    public BoxDrawingView(Context context, AttributeSet attrs) {
        …
        this.setId(BOX_DRAWING_ID);
    }
    …

}
于 2014-05-23T14:49:29.593 に答える