2017-09-15 5 views
0

私はアンドロイドアプリケーションを使っています。私はバックスタックヒストリーにフラグメントを追加するような問題に直面しています。フラグメントAからフラグメントBに移動し、フラグメントBでボタンをクリックしてフラグメントAに戻りたいと思っています。私はこれが起こることを望んでいません。解決策を教えてください。私のコードの構造は以下の通りである:バックスタッキングにフラグメントを追加せずにアンドロイドで断片をナビゲートする

フラグメントA:

....... 
FragmentB fragmentB = new FragmentB(); 
showFragmentOmitStack(fragmentB); 
.... 


public void showFragmentOmitStack(Fragment fragment) { 
FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
transaction.add(R.id.container,fragment);//add // replace 
transaction.addToBackStack(null); 
transaction.commit(); 
} 

断片B:

FragmentA fragmentA = new FragmentA(); 
showFragment(fragmentA, "FragmentA"); 


public void showFragment(Fragment fragment, String back_stack_name) { 
FragmentManager fragmentManager = thisActivity.getFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
fragmentTransaction.add(R.id.container, fragment); 
fragmentTransaction.addToBackStack(back_stack_name); 
fragmentTransaction.commit(); 
} 

My活動のJavaファイルで:

@Override 
public void onBackPressed() { 
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
if (drawer.isDrawerOpen(GravityCompat.START)) { 
    drawer.closeDrawer(GravityCompat.START); 
    } else { 
    if (getFragmentManager().getBackStackEntryCount() == 0) { 
     showAlertDialog(Constants.EXIT_APP, Constants.APP_NAME); 
    } else { 
     getFragmentManager().popBackStackImmediate(); 
      } 
     } 
    } 
+0

あなたは、フラグメントBのボタンをクリックすると、ちょうどbackstackポップ、新しいフラグメントAを追加しないでください。あなたのバックスティックを行う方法はA B Aになります。 – ElDuderino

答えて

0

あなたがする予定がない場合バックプレスを使って前のフラグメントに戻ります。フラグメントを追加するときに、フラグメントをbackStackに追加しないでください。つまり、remove t彼:

fragmentTransaction.addToBackStack(myFragmentName); 

は、各フラグメントは、それは自分の取引ですので、あなたがaddToBackStackとAを追加するときに、断片化するrefferingのthatsています!フラグメントBのトランザクションでは、これをnullに設定します.Bはバック・タックには入りません。バックプレスの影響を受けるバックスタックの唯一の部分はA!

+0

はい私はそれをnullにしましたtransaction.addToBackStack(null);フラグメントAからフラグメントBコールに至るとき。 –

+0

フラグメントBをバックスタックに追加しないようにします –

+0

いいえ!各フラグメントには独自のトランザクションがありますので、addToBackStackでAを追加すると、フラグメントAを参照しています!フラグメントBのトランザクションではnullに設定しますが、Bはバックスタックには入りません。バックプレスの影響を受けるバックスタックの唯一の部分はA! – Ricardo

0

あなただけ

yourTransaction.addToBackStack(null)を削除し、そこから戻ってフラグメントAへのあなたを動かす断片Bに設定したボタンのクリックイベントでは、

あなたは行かなくてはなりません。

0

あなたは2つだけフラグメント、A及びBで作業している場合は、このような何か行うことができます:あなたの活動

@Override 
public void onBackPressed() { 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
    drawer.closeDrawer(GravityCompat.START); 
    } 
    else if (currentFragment instanceOf FragmentB) { 
    Fragment fragmentA = new FragmentA(); 
    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = 
    fragmentManager.beginTransaction(); 
    fragmentTransaction.replace(R.id.container, fragmentA); 
    fragmentTransaction.commit(); 
    currentFragment = fragmentA; 
    } 
    else { 
     super.onBackPressed(); 
     } 
    } 
} 

代わりのバックスタックに追加することで

を、あなたのクラスにインスタンス変数を作成してください:Fragment currentFragment = null;。そして、あなたが始めた断片にcurrentFragmentを設定し続けてください。

0

これを試してみてください:

@Override 
public void onBackPressed() { 
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
     getSupportFragmentManager().popBackStack(); 
    }else { 
     if (drawerLayout.isDrawerOpen(GravityCompat.START)) { 
      drawerLayout.closeDrawer(GravityCompat.START); 
     } else { 
      super.onBackPressed(); 
     } 
    } 
} 
関連する問題