私の設定は次のとおりです。
2つのフラグメントをロードするアクティビティから呼び出されたFragmentPagerAdapterがあります。これはonCreate内で設定されます。
onResumeでは、データベースからデータをロードするASyncTaskを呼び出してから、ロードデータリスナーを介してアクティビティonLoadCompleteでコールバックを呼び出します。
@Override
public void onLoadComplete(JSONArray data) {
// TODO Auto-generated method stub
LocalFragment fragmentB = (LocalFragment)getSupportFragmentManager().findFragmentByTag(ListTag);
fragmentB.setList(data);
LMapFragment fragmentA = (LMapFragment)getSupportFragmentManager().findFragmentByTag(MapTag);
GoogleMap our_map = fragmentA.getMap();
fragmentA.plotP(myLocation,data);
}
フラグメントはPagerによって初期化され、各フラグメントコード内で、たとえばLocalFragmentでそれぞれのタグを設定します。
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
String myTag = getTag();
((PagerTest) activity).setListTag(myTag);
Log.d("what",myTag);
}
これにより、フラグメントにアクセスしたり、リストにデータを入力したり、マップにデータを入力したりする関数を呼び出すことができます。できます。
私が今やろうとしているのは、画面の向きの変更を説明することです。ASyncTaskの実行中に向きが変更されると、アプリがクラッシュします。
ここで提案されているように:隠しフラグメントASyncTaskの状態を保存する隠しフラグメントを実装しようとしています。だから私がやったことはそれを設定することです私の活動のonResumeで私は関数を呼び出します
static LoadDataFromURL the_data = null;
static JSONArray pub_data = null;
private static final String TAG = "RetainFragment";
public RetainFragment() {}
public static RetainFragment findOrCreateRetainFragment(FragmentManager fm) {
RetainFragment fragment = (RetainFragment) fm.findFragmentByTag(TAG);
if (fragment == null) {
fragment = new RetainFragment();
fm.beginTransaction().add(fragment, TAG).commit(); // add this
}
return fragment;
}
これは基本的に私のデータを保存します。
基本的に、これが意味するのは、画面を回転させても、ASyncTaskを再度呼び出さないことです。画面が回転するだけです。完全に機能します。
ただし、メインメニューに戻ってアクティビティをもう一度クリックすると、画面は空白になります(ただしクラッシュしません)。私の理解では、データはフラグメント内のオブジェクトとして保持されますが、アクティビティを新たにリロードするときに、データを再度設定する必要があります。リスト/マップにデータを入力するには、IEonLoadCompleteを呼び出す必要があります。
したがって、最初にASyncTaskが完了した後、返されたデータを非表示のフラグメントonRetainInstanceに保存すると、onLoadCompleteを呼び出して渡すことができると結論付けました。
問題は、この状況では、タグがnullであるため、フラグメントがまだ呼び出されていないように見え、onLoadComplete内でコールバックを呼び出すとアプリがクラッシュすることです。
私は何年もの間これに頭をぶつけてきました。
私のASyncTaskは別のクラスにあります:LoadDataFromURL達成したいのは次のとおりです-画面上の回転でASyncTaskが回転/新しいアクティビティにアタッチされたままになり、完了した場合は再度実行しないようにするfragmentviewpager ..
誰かアドバイスしてもらえますか?
どうもありがとう
編集
シークレットフラグメントの変数をパブリック変数に変更したので、すべてが一緒になっているように見えます。しかし、どのように/いつ呼び出されるかが100%わからないため、なぜそれが機能するのか完全には理解できません。
つまり、findOrCreateRetainFragmentを呼び出すと、新しい「シークレット」フラグメントが作成されるか、現在のインスタンスが返されます。
現在のインスタンスを返している場合は、非同期タスクを再度呼び出さないでください。そうでない場合は、非同期タスクを呼び出してデータをロードします。
この設定では、アクティビティを読み込んで画面を回転させると、期待どおりに回転します。
ここで、メインメニューに戻ってアクティビティをもう一度クリックすると、非同期タスクが呼び出されます。
私の理解では、ローテーション時に非同期タスクが再度呼び出されることはなく、viewpagerはどういうわけかフラグメントを保存しています。
一方、戻ると、秘密のフラグメントと同様にアクティビティが破棄されます。そのため、もう一度クリックすると、データが読み込まれます。これは本質的に私が欲しいものです。
私はこれを正しく理解しましたか?
ありがとう