2017-11-01 15 views
0

私が取り組んでいるアプリケーションのバックキーの動作を変更するために、onBackPressed関数をオーバーライドしています。.remove(フラグメント)を呼び出した後にフラグメントが削除されない

FragmentTransactionに特定のタグqFragを含むフラグメントが含まれている場合、ビューからフラグメントをアニメートする必要があります。

ただし、フラグメントを削除してもまだそこにあるように見えます。このため、私のif文の条件は決してelseに達しません。

@Override 
public void onBackPressed() { 
    // After pressing the back key a second time, questionFrag still has a value. 
    Fragment questionFrag = getSupportFragmentManager().findFragmentByTag("qFrag"); 

    // If question fragment in the fragment manager 
    if (questionFrag != null) { 
     getSupportFragmentManager() 
       .beginTransaction() 
       .setCustomAnimations(R.anim.slide_up, R.anim.slide_down) 
       .replace(R.id.main_menu_content_frame_layout, new Fragment(), "temp") 
       .remove(questionFrag) 
       .commit(); 

    } else { 
     finish(); 
    } 

} 

適切にトランザクションマネージャからフラグメントを削除する方法についてアドバイスをいただけますか?

if (questionFrag != null) { 
    getSupportFragmentManager() 
      .beginTransaction() 
      .remove(questionFrag) 
      .add(R.id.main_menu_content_frame_layout, new Fragment(), "temp") 
      .setCustomAnimations(R.anim.slide_up, R.anim.slide_down) 
      .commit(); 

      System.out.println("questionFrag removed successfully"); 

      finish() 
} else { 
    finish(); 
} 

あなたはのSystem.outを追加することができます。

答えて

1

あなたはこのテーマで断片について知っておく必要が二つあります。

1 - あなたはフラグメントにタグを与え、あなたが最も確かにあるスタックをバックアップするためにそれを追加し、この:

Fragment questionFrag = getSupportFragmentManager().findFragmentByTag("qFrag"); 
は、

は、popBackStack()に電話するとnullを返します。あなたはそれを呼び出さないので、たとえあなたがその上でremoveを呼び出しても、フラグメントはバックスタックにまだ格納されています。

2 - あなたはreplace呼び出すときにそう、この

.replace(R.id.main_menu_content_frame_layout, new Fragment(), "temp") 
与えられたコンテナ内にあるすべてのフラグメントに削除してから、新しいものを追加呼び出しているので、コード

.replace(R.id.main_menu_content_frame_layout, new Fragment(), "temp") 
.remove(questionFrag) 

のこのビットはredundatです

で十分です。

バックスタックをpopingは後に置き換えます:

if (questionFrag != null) { 
    getSupportFragmentManager() 
     .beginTransaction() 
     .replace(R.id.main_menu_content_frame_layout, new Fragment(), "temp") 
     .setCustomAnimations(R.anim.slide_up, R.anim.slide_down) 
     .commit(); 

    getSupportFragmentManager().popBackStack();  

    System.out.println("questionFrag removed successfully"); 

    finish() 
} else { 
    finish(); 
} 

または、代わりにbackstackをpopingのを、フラグメントがであるかどうかを確認

今、2つの方法がありますあまりにもされているあなたの問題を解決コンテナ

Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.main_menu_content_frame_layout); 

if(fragment instanceOf QuestionFragment){ 
    getSupportFragmentManager() 
     .beginTransaction() 
     .replace(R.id.main_menu_content_frame_layout, new Fragment(), "temp") 
     .setCustomAnimations(R.anim.slide_up, R.anim.slide_down) 
     .commit(); 

    getSupportFragmentManager().popBackStack();  

    System.out.println("questionFrag removed successfully"); 

    finish() 

} else { 
    finish(); 
} 
+1

ありがとうございます。トピックに苦しんでいるとこれは確かに役立ちます。 – Airagale

0

(.removeは、コンテナを空になるので、交換しないで)、新しいフラグメントを追加し、最初の.remove呼び出し、これを試してみてください、そして、あなたのカスタムアニメーションを設定しますコードがどの点に到達しているかを調べるために、エラーを見つけるのに良い方法です。ログにプリントアウトが表示されない場合、FragmentManagerコードが正しく実行されていないことがわかります。

関連する問題