Вопрос по android – Программно вернуться к предыдущему фрагменту в backstack
Скажем, у меня есть действие, в котором фрагменты добавлены программно:
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 но я думаю, что имитация события back key не является правильным способом (и я не могу заставить его работать):
dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
призваниеfinish()
просто закрывает действие, которое меня не интересует.
Есть ли лучший способ сделать это?
Чтобы уточнить другие предоставленные ответы, это мое решение (помещено в упражнение):
@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();
}
}
fm.getBackStackEntryCount() > 1
Error: User Rate Limit Exceeded
Это решение отлично работает для навигации по фрагментам в нижней строке, когда вы хотите закрыть приложение, когда в основном фрагменте нажата кнопка.
С другой стороны, когда вы открываете вторичный фрагмент (фрагмент во фрагменте), который определен как «подробная пицца» в моем коде он вернет предыдущее состояние первичного фрагмента. Ура!
Внутри деятельности на спине нажми поставь вот это:
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();
Добавляяfragment_tran.addToBackStack(null)
на последнем фрагменте я могу вернуться на последний фрагмент.
adding new fragment:
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();
}
});
Чтобы этот фрагмент появился снова, просто добавьте этот фрагмент в backstack, который вы хотите вернуть обратно нажатием, например:
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();
}
}
});
В приведенном выше случае я открываюLoginFragment
когдаButton button
нажата, сейчас пользователь находится вSignupFragment
, Так что еслиaddToBackStack(TAG)
называется, гдеTAG = "SignupFragment"
, то когда кнопка назад нажата вLoginFragment
мы возвращаемся кSignUpFragment
.
Удачного кодирования!
Посмотрите наgetFragmentManager().popBackStack()
методы (есть несколько на выбор)
http://developer.android.com/reference/android/app/FragmentManager.html#popBackStack ()
getFragmentManager().popBackStackImmediate();
сделал свое дело. Благодарю.
Когда мы обновляем / добавляем фрагменты,
Следует включить.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, если мы добавим / обновим фрагменты и вернемся к текущему экрану.