一度に 1 つのフラグメントを含む 1 つのアクティビティを使用しています。私はsupport.v4を使用しています。ActivityとFragmentの「onBackPressed」はオーバーライドなので、元の戻るボタンが使えず、自分でオーバーライドする必要があります。
フラグメント A にいるので、フラグメント B に移動します。フラグメント B には結果のリストが表示され、行を選択すると、フラグメント C に移動します。C にいるときに [戻る] ボタンを押すと、結果が表示された状態で B に戻ります。もう一度戻るボタンを押すと、A に移動します。シンプルに見えます。
C から B への復帰を管理します。B で戻るボタンを押すと、Fragment C の backPressed が呼び出されます。
A -> B -> C -> B (B を表示しますが、BackButton はもう機能しません)。
いくつかのコード: フラグメント C で backPressed
public void backPressed() {
FragmentTransaction transaction = ((FragmentActivity)m_context).getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.mainactivity_fragmentcontainer,((FragmentActivity)m_context).getSupportFragmentManager().findFragmentByTag("customtag"), "customtag");
transaction.commitAllowingStateLoss();
}
フラグメント B には、「customtag」というタグがあります。
B を C に置き換えると、次のようになります。
FragmentC newFrag = new FragmentC(m_context);FragmentTransaction transac = ((FragmentActivity)m_context).getSupportFragmentManager().beginTransaction();
((FragmentContainerActivity)m_context).setCurrentFragment(newFrag);
transac.replace(R.id.mainactivity_fragmentcontainer, newFrag);
transac.addToBackStack(null);
transac.commitAllowingStateLoss();
置き換えられたfragmentC(表示が変わり、フラグメントBが表示される)が戻るボタンのアクションを取得する理由は何ですか?
ご協力いただきありがとうございます。
フラグメント B の backPressed のEDIT コード (ただし、アプリケーションがフラグメント C から来る場合、アプリケーションはそこに移動しません)。
@Override
public void backPressed() {
Log.e("FragmentB", "backPressed");
//I have 2 views in FragB. If View2 is visible, I make it gone and display View1
if(mainView.findViewById(R.id.view2).getVisibility()==View.VISIBLE){
displayView1();
}else{
if(fromFragmentX){
FragmentX fragX = new FragmentX(ctx);
FragmentTransaction transac = ((FragmentActivity)ctx).getSupportFragmentManager().beginTransaction();
((FragmentContainerActivity)ctx).setCurrentFragment(fragX);
transac.replace(R.id.mainactivity_fragmentcontainer, fragX);
transac.commitAllowingStateLoss();
}else{
super.backPressed();
}
}
}
2回目の編集
何かを正確にするのを忘れていたことに気づきました。フラグメント B をフラグメント C に置き換えるときは、フラグメント B の ListView の ArrayAdapter で行っていますが、何も変更されるべきではありません。
とにかく、アプリの別の場所で別のことを試しました。FragmentU では、FragmentU を Fragment C (常に同じ) に置き換え、Fragment C で次のような属性を設定しています。
private CustomFragment fragmentFrom;
したがって、FragmentC の backPressed では、Fragment U からの場合に備えて、次のように呼び出します。
FragmentTransaction transaction = ((FragmentActivity)ctx).getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.mainactivity_fragmentcontainer, fragmentFrom);
transaction.commitAllowingStateLoss();
そして、私はまだ同じ問題を抱えています。フラグメント C から戻ると、フラグメント U が表示され、正常に動作しますが、戻るボタンは FragmentC.backPressed を呼び出します。