21

フラグメントを使用してポップアウトしているときに、奇妙な問題が発生します。

私は1つのフラグメントアクティビティを持っています:

ステップ 1: 開始という名前のフラグメント A で、そのアクティビティの onCreate に 1 つのフラグメントを次のようにアタッチしています。

これは Fragment アクティビティの 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();

ここに私のフラグメントのアクティビティ onBackPressedButton 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 で説明されているように前のフラグメントが正常に取得され、popbackstack が実行され、前のフラグメントに移動します。しかし、Fragment_More からもう一度押すと、空白の FRAGMENT コンテンツが表示されます。アクティビティの OnCreate のステップ 1 で追加した最初のフラグメントは表示されません。

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

ありがとう

4

3 に答える 3

51

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

@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();
    }

例:

ABという 2 つのフラグメントがあるとします。

Aをページにフラグメント化し、" " .add()( = アクションの逆を保存)すると、[戻る] をクリックしたときにREMOVE フラグメントAがアクションとして保存されます。addToBackStack()

A.replace()フラグメントBでフラグメント化し、さらに " " を保存すると、[戻る] をクリックしたときにアクションとしてBの削除とA の追加が保存されます。addToBackStack()

では、最初のフラグメント トランザクションをバックスタックに追加することが適切でない理由がわかったでしょうか? 押すとフラグメントAが削除され、空白のページが表示されます。これで十分な情報であることを願っています。

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

于 2014-09-19T12:05:08.340 に答える
2

あなたの行:

if(fm.getBackStackEntryCount() > 1){

次のようにする必要があります。

if (fm.getBackStackEntryCount() > 0) {

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

于 2015-01-07T02:24:26.030 に答える
1

これを使用しています

manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();

代わりにこれを使用してみてください

manager.beginTransaction().replace(R.id.frameContent, home).addToBackStack("home").commit();

それがあなたのために働くかどうか私に知らせてください。

于 2014-09-19T12:05:40.027 に答える