web-dev-qa-db-ja.com

プログラムでバックスタックの前のフラグメントに戻る

プログラムでフラグメントを追加したアクティビティがあるとします。

private void animateToFragment(Fragment newFragment, String tag) {
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, tag);
    ft.addToBackStack(null);
    ft.commit();
}

表示されていた前のフラグメントに戻るための最善の方法は何ですか?

私は見つけた Androidのボタンクリックでバックボタン機能をトリガーする が、バックキーイベントをシミュレートするのは正しい方法ではないと思う(そして私はそれをうまく動かすことができません):

dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));

finish()を呼ぶことは私が興味を持っていない活動をただ閉じます。

これについてより良い方法はありますか?

194
Aske B.

getFragmentManager().popBackStack()メソッドを見てください(から選択するいくつかあります)

http://developer.Android.com/reference/Android/app/FragmentManager.html#popBackStack()

322
stuckless

提供されている他の答えを詳しく説明するために、これは私の解決策です(アクティビティに配置):

@Override
public void onBackPressed(){
    FragmentManager fm = getFragmentManager();
    if (fm.getBackStackEntryCount() > 0) {
        Log.i("MainActivity", "popping backstack");
        fm.popBackStack();
    } else {
        Log.i("MainActivity", "nothing on backstack, calling super");
        super.onBackPressed();  
    }
}
119
Kyle Falconer

フラグメントを更新または追加するときは、

.addToBackStack()を含めるべきです。

getSupportFragmentManager().beginTransaction()
    .add(detailFragment, "detail") // Add this transaction to the back stack (name is an optional name for this back stack state, or null).
    .addToBackStack(null)
    .commit();

その後、getFragments.popBackStackImmediate()を指定した場合、フラグメントを追加/更新して現在の画面に戻るとtrueが返されます。

24
Jabeer

OnBackPressed()メソッドにそれらの行を追加します。 popBackStackImmediate()メソッドを使用すると、バックスタックにフラグメントがある場合は前のフラグメントに戻ります。

if(getFragmentManager().getBackStackEntryCount() > 0){
     getFragmentManager().popBackStackImmediate();
}
else{
    super.onBackPressed();
}

`

8
Avijit Biswas

このソリューションは、プライマリフラグメントで戻るときにアプリを閉じるときに、下部バーベースのフラグメントナビゲーションに最適です。

一方、私のコードで "DetailedPizza"として定義されているセカンダリフラグメント(fragment in fragment)を開いていると、プライマリフラグメントの前の状態が返されます。乾杯!

背中の内側の活動はこれを置く:

Fragment home = getSupportFragmentManager().findFragmentByTag("DetailedPizza");

    if (home instanceof FragmentDetailedPizza && home.isVisible()) {
        if (getFragmentManager().getBackStackEntryCount() != 0) {
            getFragmentManager().popBackStack();
        } else {
            super.onBackPressed();
        }

    } else {
        //Primary fragment
        moveTaskToBack(true);
    }

そしてこのような他のフラグメントを起動します。

Fragment someFragment = new FragmentDetailedPizza();
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.container_body, someFragment, "DetailedPizza");
    transaction.addToBackStack("DetailedPizza");
    transaction.commit();
4

次のコードを使用して、プログラム的に前のフラグメントに戻ります。

if ( getFragmentManager().getBackStackEntryCount() > 0) 
{
          getFragmentManager().popBackStack();
          return;
}
super.onBackPressed();
1

その断片を再び出現させるには、その断片をバックスタックに追加します。

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Fragment fragment = new LoginFragment();
        //replacing the fragment
        if (fragment != null) {
            FragmentTransaction ft = ((FragmentActivity)getContext()).getSupportFragmentManager().beginTransaction();
            ft.replace(R.id.content_frame, fragment);
            ft.addToBackStack("SignupFragment");
            ft.commit();
        }
    }
});

上記の場合、私はButton buttonが押されたときにLoginFragmentを開いています、今ユーザーはSignupFragmentにいます。 addToBackStack(TAG)が呼び出された場合、ここでTAG = "SignupFragment"、戻るボタンがLoginFragmentで押されると、SignUpFragmentに戻ります。

ハッピーコーディング!

1
Saurabh Singh

以下のコードを試してください:

@Override
    public void onBackPressed() {
        Fragment myFragment = getSupportFragmentManager().findFragmentById(R.id.container);
        if (myFragment != null && myFragment instanceof StepOneFragment) {
            finish();
        } else {
            if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
                getSupportFragmentManager().popBackStack();
            } else {
                super.onBackPressed();
            }
        }
    }
0
adarsh

最後のフラグメントにfragment_tran.addToBackStack(null)を追加することで、最後のフラグメントに戻ることができます。

新しいフラグメントを追加します

view.findViewById(R.id.changepass).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.container, new ChangePassword());
            transaction.addToBackStack(null);
            transaction.commit();
        }
    });
0
Baljinder Maan