29

私のアプリケーションには1 つとactivity複数しかありません。fragments

2 つのメイン フラグメント A (左) と B (右)。

Fragment A1 called from A

B1 called from B

B2 called from B1

すべてfragmentsに個別のバックボタンがあります。

したがって、fragment A1の戻るボタンを押すとAに戻り、同様にB2から戻るボタンを押すとB1が表示され、 B1からBに移動します。

このタイプの機能を実装するにはどうすればよいですか?

4

10 に答える 10

41
public void onBackPressed()
{
    FragmentManager fm = getActivity().getSupportFragmentManager();
    fm.popBackStack();
}
于 2013-01-11T10:10:13.793 に答える
27

私は今、同様のシナリオを実装しました。

アクティビティ「A」->フラグメント「A1」を呼び出し、メニュー項目をクリックすると、フラグメント「A2」が呼び出され、ユーザーが「A2」から戻るボタンを押すと、「A1」に戻り、ユーザーが押すとその後、「A1」から戻り、アクティビティ「A」を終了して戻ります。

次のコードを参照してください。

アクティビティ 'A' - OnCreate() メソッド:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activityA);

    if (savedInstanceState == null) {
        Fragment fragInstance;

        //Calling the Fragment newInstance Static method
        fragInstance = FragmentA1.newInstance();

        getFragmentManager().beginTransaction()
                .add(R.id.container, fragInstance)
                .commit();
    }
}

フラグメント:「A1」

メニュー項目のクリック アクションが発生したときに、既存のフラグメントを新しいフラグメントに置き換えています。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.action_edit_columns) {
        //Open the Fragment A2 and add this to backstack
        Fragment fragment = FragmentA2.newInstance();
        this.getFragmentManager().beginTransaction()
                .replace(R.id.container, fragment)
                .addToBackStack(null)
                .commit();

        return true;
    }
    return super.onOptionsItemSelected(item);
}

アクティビティ 'A' - onBackPressed() メソッド:

すべてのフラグメントには 1 つの親アクティビティ (「A」) があるため、onBackPressed() メソッドを使用すると、フラグメントがある場合はそれをポップしたり、前のアクティビティに戻ることができます。

@Override
public void onBackPressed() {
    if(getFragmentManager().getBackStackEntryCount() == 0) {
        super.onBackPressed();
    }
    else {
        getFragmentManager().popBackStack();
    }
}

Fragments 内に Embedding Fragments を探している場合は、次のリンクを参照してください: http://developer.android.com/about/versions/android-4.2.html#NestedFragments

于 2015-02-25T02:22:18.327 に答える
17

@trueblueの回答により、マイナーだが厄介な問題が1つ発生しました。バックスタックにフラグメントが 1 つしかないときに [戻る] ボタンを押すと、そのフレームが削除され、アプリは空白の画面でアクティブなままになります。アプリを終了するには、ユーザーが戻るボタンをもう一度押す必要がありました。この状況を処理するために、元のコードを次のように変更しました

@Override
public void onBackPressed() {
    if(getFragmentManager().getBackStackEntryCount() == 0) {
        super.onBackPressed();
    }
    else if(getFragmentManager().getBackStackEntryCount() == 1) {
        moveTaskToBack(false);
    }
    else {
        getFragmentManager().popBackStack();
    }
}

バックスタックにフラグメントが 1 つしかない場合、基本的にはアプリ全体を後ろに移動するように Android に指示しています。

更新(そしておそらくより良い答え)

したがって、これについてさらに読んだ後、フラグメントマネージャートランザクションをバックスタックに追加すると、Android がバックプレスを自動的かつ望ましい方法で処理できることがわかりました。以下のコード スニペットは、その方法を示しています。

Fragment fragment; //Create and instance of your fragment class here
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

fragmentTransaction.replace(R.id.fragment_container, fragment).addToBackStack(null);
fragmentTransaction.commit();
fragmentTransaction.addToBackStack(null);

最後の行は、トランザクションをバック スタックに追加する方法を示しています。これにより、1 つを除いてほとんどの状況でフラグメントのバック プレスの問題が解決されます。戻るボタンを押し続けると、最終的にバック スタックにフラグメントが 1 つだけになるポイントに到達します。この時点で、次の 2 つのいずれかを実行する必要があります。

  1. アクティビティが実行されているタスクのバック スタックから、フラグメントを格納しているアクティビティを削除します。これは、空白のアクティビティで終わりたくないためです。
  2. アクティビティがタスクのバック スタック内の唯一のアクティビティである場合は、バックグラウンドでタスクをプッシュします。

私の場合は後者だったのでonBackPressed、以前の回答からオーバーライドされたメソッドを次のように変更しました

@Override
public void onBackPressed() {
    if(getFragmentManager().getBackStackEntryCount() == 1) {
        moveTaskToBack(false);
    }
    else {
        super.onBackPressed();
    }
}

このコードは、ロジックが少なく、カスタム コードよりもフレームワークに依存しているため、より単純です。残念ながら、必要がなかったため、最初の状況ではコードを実装できませんでした。

于 2016-06-25T17:11:50.233 に答える
5

ジャスト・ドゥ

getActivity().getFragmentManager().popBackStack();
于 2015-10-02T05:52:32.237 に答える
5

こちらで説明されているように、独自のバックスタック実装を実装する必要があります。

popFragments()フラグメントの戻るボタンをクリックするたびに を呼び出し、pushFragments()あるフラグメントから別のフラグメントに移動するたびに呼び出すことができます。

于 2013-01-11T10:06:58.847 に答える
1

これを試してください、それは私にとってはうまくいきます。

public void onBackPressed() {
    if (mainLayout.isMenuShown()) {
        mainLayout.toggleMenu();
    } else {
        FragmentManager fm = getSupportFragmentManager();
        Log.print("back stack entry", fm.getBackStackEntryCount() + "");

        if (fm.getBackStackEntryCount() > 1) {
            fm.popBackStack();
            // super.onBackPressed();
            // return;
        } else {
            if (doubleBackToExitPressedOnce) {
                fm.popBackStack();
                super.onBackPressed();
                return;
            }

            this.doubleBackToExitPressedOnce = true;
            Toast.makeText(this, "Press one more time to exit",
                    Toast.LENGTH_SHORT).show();

            new Handler().postDelayed(new Runnable() {

                @Override
                public void run() {

                    doubleBackToExitPressedOnce = false;
                }
            }, 3000);

        }
    }
}
于 2015-05-28T07:04:00.200 に答える
0

戻るボタンは、 Fragments がbackstack に追加された順序でトラバースします。これはデフォルトでナビゲーション機能として提供されます。特定のフラグメントに移動したい場合は、バックスタックから表示できます。

于 2013-01-11T10:06:40.897 に答える
0

にタグを追加することで処理できますbackStack。ここで私の答えを確認してください:

https://stackoverflow.com/a/19477957/1572408

それが役に立てば幸い

于 2014-02-04T06:09:16.570 に答える
-1

画像を押すと、このように最初にメソッドを作成する必要があります

private void Backpresses() {
    getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.contant_main, new Home()).commit();
}

次に、画像を押すときにこのように呼び出す必要があります..

 back.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   Backpresses();

                }
            });

それは私にとってはうまくいきます。

于 2016-10-05T07:49:00.227 に答える
-1
@Override
public void onResume() {

    super.onResume();

    getView().setFocusableInTouchMode(true);
    getView().requestFocus();
    getView().setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {

            if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){

                // replace your fragment here

                return true;

            }

            return false;
        }
    });
}

// ハッピーコーディング

于 2014-11-26T09:00:11.063 に答える