17

私はフラグメントトランザクションに取り組んでおり、バックスタックは次のようになります:

fragA => fragB => fragC => fragD

fragD から戻った後、fragA に戻りたい

fragD => onBackPress => fragA

だから、私は次のようなコードを試しました:

getChildFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

しかし、すべてのバックスタックをクリアします。どうすれば最初のフラグメントをバックスタックに保持できますか? どうもありがとう

4

10 に答える 10

24

たとえば、次のことができます。

  • backStack に追加せずに fragA を追加します。そのため、常に
    アクティブであり、戻るボタンには反応しません。
  • fragD を開くときは、フラグメント BackStack をクリアする必要があります。したがって、Dフラグから戻るボタンを押すと、Aに戻ります.

PSあなたが望むことをする方法は他にもあります。場合によります...

于 2015-02-06T08:33:05.480 に答える
4

バックスタックには、フラグメント自体ではなく、トランザクションに関するレコードが含まれます。したがって、最初のトランザクションのレコード (null -> fragA) をバックスタックに追加しないでください。そして、他のすべてのトランザクションのレコードをバックスタックに追加する必要があります。この場合、popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);fragA がどのように追加されたかについての記録がないため、fragA を除くすべてのフラグメントを削除しました。

于 2015-02-06T08:22:31.890 に答える
4

「バックスタック」にはスタックのような動作があるため...後入れ先出し...バックスタックに追加した最後のフラグメントが最初にバックスタックからポップアウトされます。独自の動作を指定して、必要な動作を手動で実装する必要があります。FragmentManagerこれは、クラス メソッドを使用するとそれほど難しくありません。

フラグメントをトランザクションに追加するときにフラグメントを「タグ付け」すると...

 fragmentTransaction.add(new FragmentA(), "FragmentA_Tag");

戻るボタンが押されたときに表示するフラグメントを後で決定できます...

FragmentA f = fragmentManager.findFragmentByTag("FragmentA_Tag");
if(f != null){
    f.show();
}

どのフラグメントを表示するかを決定する方法は、完全にあなた次第です。現在表示されているフラグメントを追跡するかisHidden、クラスのメソッドを使用できますFragment...ところで、ここではネイティブフラグメントについて話しているのですが、ライブラリのフラグメントはサポートしていません。

于 2015-02-06T08:06:11.070 に答える
1

多くの投稿を調べた後、私は次のように考え出しました:

fragC => fragD メソッドで、2 つのトランザクションを実行します。

1 バック スタックのクリア、fragC => fragA

2 FragA => FragD

しかし、この方法では、fragA の元の状態が破壊される可能性があります。

public static void changeFragCtoD(FragmentManager fm, Fragment fragD){
    fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    FragmentTransaction fragmentTransaction = fm.beginTransaction();
    fragmentTransaction
            .replace(R.id.containerViewId, new fragAClass())
            .commit();

    FragmentTransaction fragmentTransaction = fm.beginTransaction();
    fragmentTransaction
            .replace(R.id.containerViewId, fragD)
            .addToBackStack(fragD.getClass().getName())
            .commit();
}

fragD をもう一度押すと、fragA に戻ります。

于 2019-09-18T10:41:38.790 に答える
0

onbackpressed (Mainactivity) をオーバーライドし、フラグメント マネージャーの getBackStackEntryCount() を使用して、1 に等しくないかどうかを確認し、その条件でのみ popbackstack を行うことができます。

@Override
public void onBackPressed() {
  if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
     if (!(getSupportFragmentManager().getBackStackEntryCount() == 1)) {
      getSupportFragmentManager().popBackStack() ;
    }
  }    
}

于 2020-08-22T03:13:15.733 に答える
0

1) 以下のコードを使用して最初のフラグメントを追加します

android.support.v4.app.FragmentManager fm = getActivity().getSupportFragmentManager();
        android.support.v4.app.FragmentTransaction ft=fm.beginTransaction();
        if (fm.findFragmentById(R.id.fragment_container) != null) {
            ft.hide(fm.findFragmentById(R.id.fragment_container));
        }
        ft.add(R.id.fragment_container, new OneFragment(),OneFragment.class.getCanonicalName())
                .addToBackStack(OneFragment.class.getCanonicalName()).commit();

2) 以下のコードを使用して、最初のフラグメントから 2 番目のフラグメントを追加します。

android.support.v4.app.FragmentManager fm = getActivity().getSupportFragmentManager();
                    android.support.v4.app.FragmentTransaction ft=fm.beginTransaction();
                    if (fm.findFragmentById(R.id.fragment_container) != null) {
                        ft.hide(fm.findFragmentById(R.id.fragment_container));
                    }
                    ft.add(R.id.fragment_container,new TwoFragment(),TwoFragment.class.getCanonicalName())
.addToBackStack(TwoFragment.class.getCanonicalName()).commit();

3) 以下のコードを使用して、2 番目のフラグメントから 3 番目のフラグメントを追加します。

android.support.v4.app.FragmentManager fm = getActivity().getSupportFragmentManager();
                android.support.v4.app.FragmentTransaction ft=fm.beginTransaction();
                if (fm.findFragmentById(R.id.fragment_container) != null) {
                    ft.hide(fm.findFragmentById(R.id.fragment_container));
                }
                ft.add(R.id.fragment_container, new ThreeFragment(),ThreeFragment.class.getCanonicalName())
                        .addToBackStack(ThreeFragment.class.getCanonicalName()).commit();

4) 以下のコードを使用して、3 番目のフラグメントから 4 番目のフラグメントを追加します。

android.support.v4.app.FragmentManager fm = getActivity().getSupportFragmentManager();
                android.support.v4.app.FragmentTransaction ft=fm.beginTransaction();
                if (fm.findFragmentById(R.id.fragment_container) != null) {
                    ft.hide(fm.findFragmentById(R.id.fragment_container));
                }
                ft.add(R.id.fragment_container, new FourFragment(),ThreeFragment.class.getCanonicalName())
                        .addToBackStack(FourFragment.class.getCanonicalName()).commit();

5) onBackPressed() コードの下に記述してください

@Override
    public void onBackPressed() {
        hideKeyboard(MainActivity.this);
        Fragment currentFragment = this.getSupportFragmentManager().findFragmentById(R.id.fragment_container);

        if (currentFragment.getClass().getName().equalsIgnoreCase(FourFragment.class.getName())) { // Using this code come from third fragment to first fragment
            Fragment f = this.getSupportFragmentManager().findFragmentByTag(TwoFragment.class.getCanonicalName());
            if (f != null) {
                this.getSupportFragmentManager().popBackStackImmediate(f.getClass().getCanonicalName(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
            }
        }else {
            super.onBackPressed();
        }
    }
于 2018-08-24T18:39:51.297 に答える