1

アプリで v4 サポート ライブラリを使用しており、通常の状況では正常に機能するステップ ベースのプロセスがアプリに含まれています。ただし、すべてが機能する必要があり、メモリ不足の状況下でクラッシュしないという要件があります。そのため、これを支援するために SetAlwaysFinish ライブラリを使用しています ( https://github.com/bricolsoftconsulting/SetAlwaysFinish )。この種の状況を検出して処理する必要がある領域を特定するのに非常に役立ちましたが、困惑する状況に遭遇しました. これは通常の状況では正常に機能することに注意してください。ただし、「setAlwaysFinish」= ON で明示的にテストしています。

これが私のセットアップです。ViewPager のレイアウトをホストする「ProcessActivity」クラスがあります。ViewPager には Adapter セットがあり、これにはプロセスを網羅する Fragments のリストが含まれています。これは onCreate() メソッドにあります。

プロセス アクティビティ:

createSteps();  // this creates/populates the ArrayList "processSteps" with Fragments
theAdapter = new ProcessAdapter(this, processSteps); // the ProcessAdapter class extends FragmentStatePagerAdapter, with an additional list of Fragment steps
theViewPager.setAdapter(theAdapter);

他にもパーツはありますが、それがセットアップ方法の核心です。Fragment ステップの 1 つの間に、実際にはステップ プロセスから「中断」し、一時的にアクティビティにプッシュして何らかのロジックを実行する必要があります (その後、ステップ プロセスに戻ります)。アクティビティが終了したときに、アクティビティで OK/Cancel アクションを処理できるようにする必要があるため、ForResult を使用して次のようにします。

Step4Fragment :

Intent intent = new Intent(getActivity(), ThePushActivity.class);
intent.putExtra(blah..);
startActivityForResult(intent, THE_REQCODE);

このビューにプッシュされると、ProcessActivity と Step4Fragment の両方の onDestroy() メソッドが呼び出されることがあります (alwaysFinish のため)。正常に動作しているように見えて、Step-Fragment プロセスにコールバックすることがあります。しかし、通常は、ProcessActivity の onDestroy() メソッドを呼び出してから、バンドルに保存されたインスタンスの状態を設定して onCreate() メソッドを再度呼び出します。これにより、上記のステップ作成コードが呼び出され、ユーザーが行った最後のステップが表示されているファンキーな状態にアプリが置かれますが、実際には最初のステップにあります (フラグメントは、その時点で、断線)、必然的にクラッシュが発生します。この時点で、Step4Fragment は完全にばらばらで、何かしようとするとどこかでクラッシュするようです。

これに対処する最善の方法について何か考えはありますか? メモリの問題が発生した場合にユーザーをプロセスの最初のステップに戻せるように、単にリセットする方法さえ見つければ問題ないと思います。ただし、もちろん、私の懸念はクラッシュです。

詳細を提供する必要がある場合はお知らせください。助けてくれてありがとう!

更新 #1: フラグメントが再インスタンス化および初期化され、「現在の」フラグメントの onActivityResult() メソッドに適切に分類され、適切に実行する必要があることに気付いた簡単な更新です。これらのシナリオの 1 つに従って、切断がどこにあるかは基本 ProcessActivity クラスにあるようです。ViewPager レイアウトは適切に表示されますが、ViewPager の外側のすべてが正しくありません (つまり、プロセスの最初のステップにあることを示しているのに、4 番目にあることを示す必要があり、ナビゲーション ボタンが最初のステップに表示されています)。 4 番目ではなく)。

したがって、これらの要素を手動で適切に設定する必要があると思います。これを深く掘り下げると、誰かがこれを積極的に支援するために必要なコードの一部を省略している可能性があります。この onDestroy()/onCreate() 全体が呼び出される前に、「現在表示されているフラグメント」を取得する機能を含む ViewPager フィールドの状態に何らかの方法でアクセスできたら、おそらくsavedInstanceState バンドルからですか? それはおそらく私の問題を解決するでしょう。しかし、デバッグ時にこのバンドルを調べると、フラグメント自体とそれぞれの状態しか表示されません。でも掘り続けます。

とにかく、この種のことを適切に行う方法について誰かアイデアがあれば教えてください(もちろん、高レベルで)。

更新 #2 「現在の」フラグメントが正しく開始されているように見え、ビューが正しく表示されていても、すべてが切り離されていることがわかります。getResources() や getActivity() などでメソッドを呼び出すことはできません。実際には、ステップ インデックス (int) を savedInstanceState バンドルに保存し、UI をリロードすることに基づいて、ProcessActivity を適切に「機能させる」ことができました。その周りの要素。ただし、適切に再インスタンス化されているように見えても、現在のフラグメントがアクティビティから切り離されているこのブロッカーがまだあります。

更新 #3 この投稿の指示に従う場合: ViewPager とフラグメント - フラグメントの状態を保存する正しい方法は何ですか? 、最初の putFragment() を実行しようとすると、すぐに例外が発生します。例外は、「IllegalStateException: フラグメント Step4Fragment は現在 FragmentManager にありません」です。これは、常に左に 1 つのフラグメント、右に 1 つのフラグメントのみを「アクティブ」にしているという事実に関係しているのではないかと考えています (つまり、offScreenPageLimit)。

4

2 に答える 2

0

Fragment が再インスタンス化されていないことを確認しますか?

Fragment のすべてのサブクラスには、パブリックの空のコンストラクターが含まれている必要があります。フレームワークは、必要に応じて、特に状態の復元中にフラグメント クラスを再インスタンス化することが多く、インスタンス化するためにこのコンストラクタを見つけることができる必要があります。空のコンストラクターが使用できない場合、状態の復元中に実行時例外が発生する場合があります。

于 2013-05-20T22:40:58.777 に答える