プログラムでフラグメントを追加したアクティビティがあるとします。
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()
を呼ぶことは私が興味を持っていない活動をただ閉じます。
これについてより良い方法はありますか?
getFragmentManager().popBackStack()
メソッドを見てください(から選択するいくつかあります)
http://developer.Android.com/reference/Android/app/FragmentManager.html#popBackStack()
提供されている他の答えを詳しく説明するために、これは私の解決策です(アクティビティに配置):
@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();
}
}
フラグメントを更新または追加するときは、
.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が返されます。
OnBackPressed()メソッドにそれらの行を追加します。 popBackStackImmediate()メソッドを使用すると、バックスタックにフラグメントがある場合は前のフラグメントに戻ります。
if(getFragmentManager().getBackStackEntryCount() > 0){
getFragmentManager().popBackStackImmediate();
}
else{
super.onBackPressed();
}
`
このソリューションは、プライマリフラグメントで戻るときにアプリを閉じるときに、下部バーベースのフラグメントナビゲーションに最適です。
一方、私のコードで "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();
次のコードを使用して、プログラム的に前のフラグメントに戻ります。
if ( getFragmentManager().getBackStackEntryCount() > 0)
{
getFragmentManager().popBackStack();
return;
}
super.onBackPressed();
その断片を再び出現させるには、その断片をバックスタックに追加します。
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
に戻ります。
ハッピーコーディング!
以下のコードを試してください:
@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();
}
}
}
最後のフラグメントに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();
}
});