web-dev-qa-db-ja.com

フラグメントPopBackStack

Fragmentsを使用してそれらをポップアウトしているときに、奇妙な問題が発生しています。

フラグメントアクティビティが1つあります。

ステップ1:フラグメントAという名前の開始のアクティビティのonCreateに1つのフラグメントを添付しています:

これはフラグメントアクティビティのonCreateです

@Override
    protected void onCreate(Bundle savedBundleState) {
        super.onCreate(savedBundleState);
        setContentView(R.layout.activity_base_new);

        Fragement_Home home = new Fragement_Home();
        FragmentManager manager = getSupportFragmentManager();
        manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();
    }

ステップ:2その後、添付したフラグメントを次のコードに置き換えました。

Fragment_More moreFragment = new Fragment_More();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction().replace(R.id.frameContent, moreFragment).addToBackStack("more").commit();

ステップ3:その後、同じ方法でFragment_Moreにもう1つFragmentを追加しました。

Fragment_AboutRockstand termsConditions = new Fragment_AboutRockstand();
            getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.frameContent, termsConditions).addToBackStack("about_rockstand").commit();

そして、ここに私のフラグメントのBackPressedButton Lisetenerのアクティビティがあります:

@Override
public void onBackPressed() {
    FragmentManager fm = getSupportFragmentManager();
    Fragment f = fm.findFragmentById(R.id.frameContent);

 if(fm.getBackStackEntryCount() > 1){
         fm.popBackStack();
    } else{
        finish();
    }
}

これは私が得ている問題です:

ステップ3から戻ると、onBackPressedで説明されているように、以前のフラグメントが正常に表示され、ポップバックして前のフラグメントに移動します。しかし、Fragment_Moreから、もう一度押すと、空白のFRAGMENTコンテンツが表示されます。アクティビティのOnCreateのステップ1で追加した最初のフラグメントは表示されません。

コメントしてください。私が間違っているのは何ですか?

ありがとう

20
Gaurav Arora

最初のフラグメントをバックスタックに追加しないでください。リターンキーを押すと、実行したアクションが逆になります。そのため、フラグメントを置換してから押すと、置換が元に戻ります。しかし、 '.add()' fragmenttransactionを押し戻すと、それは単に削除され、空白のページが表示されます。だから、バックスタックから最初のフラグメントを削除することでうまくいくと思う。それを試して、私に知らせてください!

_@Override
    protected void onCreate(Bundle savedBundleState) {
        super.onCreate(savedBundleState);
        setContentView(R.layout.activity_base_new);

        Fragement_Home home = new Fragement_Home();
        FragmentManager manager = getSupportFragmentManager();
        manager.beginTransaction().add(R.id.frameContent, home).commit();
    }
_

例:

[〜#〜] a [〜#〜][〜#という2つのフラグメントがあるとします。 〜] b [〜#〜]

.add()フラグメント[〜#〜] a [〜#〜]をページに追加し、「addToBackStack() "(=アクションの逆を保存)REMOVEフラグメント[〜#〜] a [〜#〜]をアクションとして保存します戻るをクリックします。

.replace() fragment[〜#〜] a [〜#〜]by fragment [〜#〜] b [〜#〜]、および「addToBackStack()」も削除を保存します[〜# 〜] b [〜#〜]および[〜#〜] a [〜#〜]をアクションとして追加背中をクリックすると。

それで、最初のフラグメントトランザクションをバックスタックに追加するのが良い習慣ではない理由がわかりますか?戻るボタンを押してフラグメント[〜#〜] a [〜#〜]を削除するだけで、空白ページになります。これが十分な情報であることを願っています。

また、最初のフラグメントからaddToBackStack()を削除したら、onBackPressed()をオーバーライドする必要はありません。バックスタックに何も残っていない場合は、最初にその空白ページを表示せずにアクティビティを終了します。

48
Chris

あなたの行:

if(fm.getBackStackEntryCount() > 1){

する必要があります:

if (fm.getBackStackEntryCount() > 0) {

バックスタックに3つのフラグメントを配置しています。最初の2つのエントリをポップオフすると、バックスタックのエントリ数は1になります。したがって、バックスタックに追加した最初のフラグメントを取得できなくなります。

2
Jerry Frost

あなたはこれを使用していますmanager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();

代わりにこれを使用してみてくださいmanager.beginTransaction().replace(R.id.frameContent, home).addToBackStack("home").commit();

うまくいくかどうか教えてください

0
omujeebr