2016-11-03 14 views
0

私はフラグメントトランザクションを処理しています。メインアクティビティからhomepage_fragmentで始まり、second fragmentに行きますが、 'homepage_fragment'に戻ったときにエラーが表示されます(下記参照)。私は新しいインスタンスではなくhomepage_fragmentの同じインスタンスに戻りたいと思います。他の方法で移動するときに呼び出されるsecond fragmentchange_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()によって返されたオブジェクト参照は正しいですが、次のステートメントの後にエラーを返します。私はここで間違っていることを明確に理解することができません。誰かが問題が何であるか教えてもらえますか?

+1

をこれは、Aのように思えます奇妙なナビゲーションフロー。通常は 'replace()'の代わりに 'add()'を使います。 2番目の 'Fragment'をバックスタックに追加した後、前の' Fragment'に戻るために 'getFragmentManager()。popBackStack()'を呼び出すだけです。または、フラグメントを交換したい場合は、 'Fragment'をバックスタックに追加することなく' replace() 'を呼び出すことができます。 – Bryan

+0

@Bryanそれはうまくいきました。私は最近これを学び始め、 'popBackStack()'について知らなかった。どうもありがとう。 – ashwinx

答えて

0

実際には新しいFragmentを作成することはありません。この方法:

Fragment newFragment = getFragmentManager().findFragmentByTag(fragName); 

だけで、あなたは自分自身でそのFragmentを交換しようとしている、バックスタック内の最後のFragmentを見つけることです。

断片のバックスタックを作成するための通常の方法はそうのようなフラグメントを追加することです:

@Override 
public void addFragment(String tag, Fragment fragment) { 
    getFragmentManager().beginTransaction() 
      .add(R.id.activity_main, fragment) 
      .addToBackStack(tag) 
      .commit(); 
} 

次に、あなただけで、最後Fragmentを削除することができます

@Override 
public void removeFragment() { 
    getFragmentManager().popBackStack(); 
} 
+0

'getFragmentManager()。findFragmentByTag(fragName);'では、必要なものであるhomepage_fragmentを取得し、参照を取得すると、現在のフラグメントを置き換えます。このコードは何をする予定ですか? – ashwinx

+0

@ashwinxはい、以前のフラグメントへの参照は必要ありません。レイアウト要素のidに基づいて 'Fragment'を置き換えたり追加したりすることができます。 – Bryan

関連する問題