私はフラグメントトランザクションを処理しています。メインアクティビティからhomepage_fragment
で始まり、second fragment
に行きますが、 'homepage_fragment'に戻ったときにエラーが表示されます(下記参照)。私は新しいインスタンスではなくhomepage_fragment
の同じインスタンスに戻りたいと思います。他の方法で移動するときに呼び出されるsecond fragment
とchange_fragment2
に移動するときAndroid:IllegalStateException:フラグメントのタグを変更できません
change_fragment
メソッドが呼び出されます。
Fragment homepage_fragment = new HomePageFragment();
getFragmentManager().beginTransaction().add(R.id.activity_main, homepage_fragment,"homepage_fragment").commit();
これらは、メインアクティビティで実装されたインターフェイスメソッドです。
@Override
public void change_fragment(){
final FragmentTransaction ft = getFragmentManager().beginTransaction();
String tag = "homepage_fragment";
Fragment newFragment = new SecondFragment();
ft.replace(R.id.activity_main, newFragment);
ft.addToBackStack(tag);
ft.commit();
}
@Override
public void change_fragment2() {
final FragmentTransaction ft = getFragmentManager().beginTransaction();
//String tag1 = getFragmentManager().getBackStackEntryAt(getFragmentManager().getBackStackEntryCount()-1).getName();
String tag1 = "second_fragment";
int lastFragCount = getFragmentManager().getBackStackEntryCount() -1;
String fragName= getFragmentManager().getBackStackEntryAt(lastFragCount).getName();
Fragment newFragment = getFragmentManager().findFragmentByTag(fragName);
ft.replace(R.id.activity_main, newFragment , tag1);
ft.addToBackStack(tag1);
ft.commit();
}
これは私が取得していますエラーです:
FATAL EXCEPTION: main
Process: com.example.user.popupwindowdemo, PID: 10309
java.lang.IllegalStateException: Can't change tag of fragment HomePageFragment{2141e52a #0 id=0x7f0c006f homepage_fragment}: was homepage_fragment now second_fragment
をreplace
方法で渡されたタグ名は現在のフラグメントをタグ付けすることで、以来、私は任意の断片のタグ名を変更していと思ういけませんここに。だから、彼らは同じままにする必要があります。
デバッグするとき、findFragmentByTag()
によって返されたオブジェクト参照は正しいですが、次のステートメントの後にエラーを返します。私はここで間違っていることを明確に理解することができません。誰かが問題が何であるか教えてもらえますか?
をこれは、Aのように思えます奇妙なナビゲーションフロー。通常は 'replace()'の代わりに 'add()'を使います。 2番目の 'Fragment'をバックスタックに追加した後、前の' Fragment'に戻るために 'getFragmentManager()。popBackStack()'を呼び出すだけです。または、フラグメントを交換したい場合は、 'Fragment'をバックスタックに追加することなく' replace() 'を呼び出すことができます。 – Bryan
@Bryanそれはうまくいきました。私は最近これを学び始め、 'popBackStack()'について知らなかった。どうもありがとう。 – ashwinx