3

ホームハードウェアボタンを使用してアプリケーションを終了すると、アプリケーションが最後の状態に戻るはずのアプリケーションがあります。ただし、アプリケーションを再度起動すると、アプリケーションにヘッダーバーのみの白い画面が表示されます。そして、ヘッダーバーのボタンをクリックすると、アプリケーションがクラッシュし、IllegalStateExceptionクリックされたボタンのメソッドが見つかりません。

私は現在、ヘッダーバーがアクションバーであるSherlocksFragmentを使用して実装しています。HTC Rhymeバージョン2.3(ジンジャーブレッド)も使用しています。以下は、私のメインアプリにフラグメントを追加するためのコードです。

アクティビティのonCreateメソッド内にフラグメントを追加するコード:

FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
Bundle bMain = getIntent().getExtras();
String statusCheck = "";
if (bMain != null) {
    statusCheck = bMain.getString("statusCheck");
}
if (statusCheck.equals("web")) {
    MyWebViewFragment webfrag = new MyWebViewFragment();
    trans.add(R.id.container,webfrag, "WebViewFragment");
} else if(statusCheck.equals("traveloguelist")) {
    MyTravelogueListFragment travelfrag = new MyTravelogueListFragment();
    trans.add(R.id.container,travelfrag, "TravelogueListFragment");
}
trans.commit();

フラグメントを変更したときのコードは次のとおりです。

MyTravelogueListFragment travelfrag = new MyTravelogueListFragment();
getSupportFragmentManager().beginTransaction().replace(R.id.container, travelfrag).addToBackStack(null).commit();

[編集]

よく読んで実行した後、主な問題は、アプリケーションを再開すると、アクティビティが実際に再度作成されることであることに気付きました。したがって、渡したパラメーターの一部が登録されず、誤った表示になります。私はこれがそれを引き起こしているエラーだと思います:

Previously focused view reported id "myresID" during save, but can't be found during restore.

ただし、フラグメントの以前の状態をアプリケーションに強制的に記憶させる方法がわかりませんか?または、この問題を回避する他の方法はありますか?

私はまだこの問題で非常に立ち往生しています。誰かが私を助けてくれるなら本当に感謝します!

4

2 に答える 2

4

多くの試行錯誤と多くの読書の後、私は最終的に私の問題を解決する方法を見つけました.

私が理解していることから、この問題はアクティビティのライフサイクルが原因で発生します。このフォーラムでの Tseng のコメントは非常に包括的でした: http://forum.unity3d.com/threads/127794-Android-Apps-crashing-on-resume

特定のアクティビティが実行されているときに他のアプリケーションが呼び出されている間、onPause/onStop必要なメモリが不足している場合、Android はアクティビティが現在保持しているメモリの一部を解放する可能性があるようです。この場合、一時停止されたアクティビティが持っている現在のオブジェクトまたは変数はすべて破棄されます。したがって、アクティビティが再びフォーカスされると、onCreateが実際に再度呼び出されます。したがって、アクティビティは、現在必要なフラグメントを認識しません。

ただし、本質的にバンドル オブジェクトである saveInstanceState が常に呼び出されることに気付きました。だから私は次のことをしました:

onSaveInstanceState メソッド

  @Override
  public void onSaveInstanceState(Bundle bundle) {
      //activityFrag is a string object that tells me which fragment i am in currently
      bundle.putString("statusCheck", activityFrag);
  }

onCreate メソッド

if (savedInstanceState != null) {
    getSupportFragmentManager().popBackStack(null, getSupportFragmentManager().POP_BACK_STACK_INCLUSIVE);
    //return;
    statusCheck = savedInstanceState.getString("statusCheck");
} else {
    statusCheck = b.getString("statusCheck");
}

私が行ったことは、必要な情報が欠落している問題を取り除くために、これまで積み上げてきたすべてのフラグメントを削除することです。ですから、これはまた新たに始めるようなものです。ステータス チェックは、ユーザーが最後にアクセスしたフラグメントを特定するだけです。

多くのテストの後、それは私の問題を解決するようです。完璧とは言えませんが。私が持っている主な欠点の 1 つは、フラグメントを変更するたびに、statusCheck を更新して変更し、正しいフラグメントが呼び出されるようにする必要があることです。ただし、この方法は少し異例であり、あまり正しくない可能性があることを認めざるを得ません。

より良いアイデアがあれば、お気軽に共有してください。

于 2013-01-25T10:24:24.937 に答える
0

次の実装を試すことができます。

  1. putFragmentを使用して、現在 FragmentManager にあるすべてのフラグメントをonSaveInstanceStateのバンドルに保存します。
  2. そして、getFragmentを使用して、以前に保存されたすべてのフラグメントをonRestoreInstanceStateのバンドルから取得できます。

また...おそらく、バンドルに保存されるフラグメントの階層を決定するのに役立つHashMapが必要になるでしょう(コンテナと含まれるフラグメントがある場合)。

また...バンドルから復元するときは、以前にそこに置いたすべてのフラグメントのキーを知る必要があります。おそらく最も簡単な方法は、フラグメントをインスタンスに保存するときに、キーの配列を整理してそれらをバンドルに入れることです。

このようにして、保存と復元が完了し、集中化されます。

于 2013-06-19T09:17:51.207 に答える