私はアプリケーションに取り組んでいますが、私を悩ませている特定のことが 1 つあります。1 つのアクティビティと 2 つの fragment.FragmentA と FragmentB があり、アクティビティの開始時に FragmentA がアタッチされるとしましょう。
向きが変わったときの断片データと断片状態を保存したいのですが、OnSavedInstanceState
メソッドを使って断片データを保存することに成功しました。ここで、フラグメントの状態をアクティビティに保存して、向きの変更が発生した場合にフラグメントになりたいと考えています (私の場合、FragmentA または FragmentB は、構成の変更が発生する前にどちらが表示されていたかによって異なります)。
これは、フラグメントの状態をActivityに保存する方法です。
@Override
protected void onSaveInstanceState(Bundle outState) {
// Save the values you need into "outState"
super.onSaveInstanceState(outState);
outState.putLong(SS_DATE, userDate.getTime());
android.support.v4.app.FragmentManager manager = getSupportFragmentManager();
Fragment currentFragment = this.getSupportFragmentManager().findFragmentById(R.id.content_container);
manager.putFragment(outState, "currentFragment", currentFragment);
}
そして、これは、方向の変更が発生したときにどのフラグメントにいたかを取得する方法です。
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
FragmentManager manager = getSupportFragmentManager();
@SuppressLint("CommitTransaction")
FragmentTransaction transaction = manager.beginTransaction();
if (savedInstanceState != null) {
Fragment MyFragment = (Fragment) manager.getFragment(savedInstanceState, "currentFragment");
if (MyFragment instanceof FragListStudentsAttendance) {
Log.v("onRestore", FragListStudentsAttendance.TAG);
}else if (MyFragment instanceof FragGetClassesForAttendance){
Log.v("onRestore", FragGetClassesForAttendance.TAG);
if(MyFragment!=null) {
mFragGetClassesForAttendance = (FragGetClassesForAttendance) MyFragment;
}else{
mFragGetClassesForAttendance = new FragGetClassesForAttendance();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
// mFragGetClassesForAttendanceNew.setRetainInstance(true);
// transaction.replace(R.id.content_ssadmin_container, mFragGetClassesForAttendanceNew, "FragGetClassesForAttendance").addToBackStack(null);
transaction.add(R.id.content_ssadmin_container, mFragGetClassesForAttendance, FragGetClassesForAttendance.TAG);
//transaction.replace(R.id.newEnrollmentMainContainer, mFragNewEnrollmentResults).addToBackStack("FragNewEnrollments");
transaction.commit();
mFragGetClassesForAttendance.setDate(userDate);
}
}
}
}
シナリオ 1: フラグメント A を使用していて、デバイスをローテーションすると、すべて正常に動作します。フラグメントと同様に、データをリストビューにロードするWebサービスがあるため、データが存在するかどうかを確認し、Webサービスを実行する必要はなく、今のところ機能しています
シナリオ 2: フラグメント B を使用していて、方向の変更が発生した場合、フラグメント B にあると想定されているため、すべて正常に機能します。[戻る] ボタンを押すと、フラグメント A が再度呼び出され、すべてのデータもサービスから取得されます。BackStackにあるはずで、データが保存されていたので、これは起こらないはずだと思います。では、ここで今何をすべきでしょうか?
シナリオ 3: FragmentB で、デバイスをローテーションすると、FragmentA の saveInstanceState 関数も呼び出されることに気付きました。なぜそうなのですか?FragmentB を FragmentA に置き換えていたのはどこですか?
いくつかの混乱:
いくつかの混乱についても話させてください.フラグメントとアクティビティのライフサイクルについて多くのことを検索して読んだことがありますが、誰かが私にそれをクリアしてくれるかもしれません. 私はアクティビティでそれを行う方法(状態を保存する方法)を知っているので、フラグメントでそれを行う方法(フラグメントビューの状態を保存する)も知っています変化(回転)?また、FragmentB を使用している場合、FragmentA はどうなりますか?