8

私はこの断片的なライフサイクルビジネスを完全には理解していません。

アプリの「詳細を表示」セクションに、かなり標準的な3ページの水平スライダービューのポケットベルレイアウトがあります。3つの中央のページからアプリを起動します。My FragmentActivityは、ページをページ1に設定します。

mPager.setCurrentItem(1); //default to center page, current data view fragment

FragmentPagerAdapterを使用すると、一時停止状態から戻ったときなどにアプリがクラッシュすることがあったため、FragmentStatePagerAdapterを使用してきました。これが、今のところこれを回避する最も簡単な方法でした。うまくいくように見えますが、おそらくここでの私の問題の原因は州の側面であると思われます。

そのため、最初は、各フラグメントにRESTサービスからデータを取得してリストに表示する作業を行わせると思っていましたが、それ以上はわかりません。

一意の非同期タスクを実行して、CreateViewイベントの各フラグメントのデータをフェッチしてみました。次に、フラグメントのライフサイクルについて詳しく読んだ後、onCreateViewが非常に頻繁に呼び出されていることに気づき、onCreateに切り替えました。これにより、ネットワークを介してデータを頻繁に要求する貪欲なアプリが作成されました。

onCreateに切り替えても何も変わりません。OnCreateは、隣接する2つのフラグメントに対してonCreateViewと同じように呼び出されます。

奇妙なことに、フラグメントアクティビティで最初に表示するように設定したフラグメントは、onCreateが1回だけ呼び出されます。

ここで何かが感じられません。

今のところ、親フラグメントアクティビティで宣言し、すべての非同期タスクを呼び出して、フラグメントに表示する必要のあるデータをフェッチする必要があると考えています。親フラグメントアクティビティが所有するオブジェクトに非同期呼び出しの結果を設定してから、フラグメントが親に含まれるオブジェクトを使用してリストビューなどを作成するようにします。

しかし、親アクティビティによって開始された非同期タスクが、CreateViewの各フラグメントが呼び出され、親に含まれるオブジェクトの準備がまだできていない場合はどうなりますか。

署名、混乱、欲求不満

4

2 に答える 2

25

ViewPagerは、現在使用していないものをシャットダウンすることに非常に熱心であり、これがまさにここで起こっていることです。デフォルトの動作では、ViewPagerは、表示されているページのいずれかの側の1つのページを「保持」し、残りを破棄します。したがって、3ページのビューでは、ページ1を選択するとページ3が破棄され、ページ2を再選択すると、ページ3が再作成されます。お気づきのとおり、ページ2onCreate(..)は、現在選択されているページに常に隣接しているか、現在選択されているため、一度だけ呼び出されています。

これを解決するには、を設定するだけですViewPager.setOffscreenPageLimit(2)。その後、ViewPagerはすべてのフラグメントを保持します。明らかに、これは多数のフラグメントにとっては良い考えではありませんが、あなたの場合は問題ないはずです。

于 2012-08-07T19:24:39.480 に答える