2017-11-10 12 views
1

私は3つのフラグメントA、BおよびCフラグメントがバックスタックから飛び出しませんか?

enter image description here これはパスである:A - > B - > C:Bに行くBC

に行くを私は戻って、フラグメントCから行くと

は、私は、フラグメントAに行きたい

  • < - C:Cは、ルートのフラグメントに戻っ
  • < - B:がルートフラグメントに戻っB

しかし、私はフラグメントCに押し戻さとき私の問題はあります、私はこのbehviourを得る:フラグメントCがbackstackから消去されていないようです。私のコードについてはenter image description here

、これはreplaceFragmentの方法は次のとおりです。

public void replaceFragment(Fragment fragment, boolean withBackStack) { 
    android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
    String fragmentTag = fragment.getClass().getName(); 
    fragmentTransaction.replace(R.id.frame, fragment, fragmentTag); 
    if (withBackStack) 
     fragmentTransaction.addToBackStack(fragmentTag); 
    try { 
     fragmentTransaction.commitAllowingStateLoss(); 
    } catch (IllegalStateException ex) { 
     ex.printStackTrace(); 
    } 
} 

まず私はボタンでクリックしたときにフラグメントAで、私はボタンをクリックしたときに、私はmListener.replaceFragment(new CFragment(), false);

呼ば断片Bで、最後にmListener.replaceFragment(new BFragment(), true); と呼ばれる、MainActivityreplaceFragment(new AFragment(), false);と呼ばれます

誰でもこの動作の説明がありますか?最後のフラグメントCは、私がバックプレスをクリックしたときに消去されるべきではありませんか?

Here例全体がわかります。 ありがとうございます!

+0

シェアXMLファイル:あなたのメソッドストア内

private Fragment mFragment; 

@Anonymousの回答に基づいてインスタンスが

@Override public void onBackPressed() { if (getSupportFragmentManager().getBackStackEntryCount() > 0) { Fragment fragment = getSupportFragmentManager().findFragmentByTag(mFragment.getClass().getName()); if (fragment != null && fragment.getClass().getName().equalsIgnoreCase(CFragment.class.getName())) { getSupportFragmentManager().beginTransaction().remove(mFragment).commit(); } getSupportFragmentManager().popBackStackImmediate(); } else { super.onBackPressed(); } } 

+0

xmlファイルでは、単純なテキストビューをフラグメントに追加し、frameLayoutをアクティビティに追加します。とにかく、これは例のリンクです:https://github.com/imen-nmn/BackStackExample –

+0

私はあなたのコードをチェックして、あなたのフラグメントXMLファイルの背景色を設定していません。その理由は重複しています。 –

答えて

1

backstressedに保存されているトランザクションをポップすると、バックスタックにfragCが追加されないため、削除されません。代わりに、backpress.Overirideバックプレスをオーバーライドしてfragmentを削除し、fragCを確認して削除してからpospstackは格納されたトランザクションをポップバックします。

フラグメントのインスタンスがfragCであるかどうかを確認するために、フラグメントのインスタンスもグローバルとして格納します。

@Override 
    public void onBackPressed() { 
     Fragment currentFragment= getSupportFragmentManager().findFragmentById(R.id.frame); 
     super.onBackPressed(); 

     if(currentFragment!=null && currentFragment.isVisible()) { 
      getSupportFragmentManager().beginTransaction().remove(currentFragment).commit(); 
      getSupportFragmentManager().popBackStack(currentFragment.getTag(), FragmentManager.POP_BACK_STACK_INCLUSIVE); 
     } 

    } 
+0

私はCから戻ってくると、私をAにリダイレクトするのは正しいことです。しかし、私がBから戻ったとき、それはBに固執した。 また、私は説明を探している。なぜ私の例ではCがバックスタックからクリアされていないのだろうか? –

+0

ご迷惑をおかけして申し訳ありません。更新されたコードを確認してください – Anonymous

+1

バックスタックにCを追加していません。それはonBackpressに削除されません。バックスタッシュに追加されるフラグメントは、バックが押されたとき – Anonymous

-1

XMLファイルの<fragment />に背景色を設定するだけです。

この問題を解決する

ハッピーコーディング!

+1

背景色を追加するだけでフラグメントを隠すことはできません最後の断片はクリアされ、バックスラックからは色で隠されているだけではなく、ポップ・オフされるべきです。 –

+0

@Nmnaあなたの問題が解決されるよりも、フラグメント内の背景色を設定してバックスタックにフラグメントを追加すると、 –

0

、私はこの問題の一般的な解決策を見つけました。
関連する問題