Фрагмент PopBackStack
Я получаю странную проблему, используя фрагменты и вытаскивая их обратно.
у меня есть один фрагмент активности:
Шаг 1: я прикрепляю один фрагмент в onCreate этой активности в начальном именованном фрагменте a как:
это onCreate активности фрагмента
@Override
protected void onCreate(Bundle savedBundleState) {
super.onCreate(savedBundleState);
setContentView(R.layout.activity_base_new);
Fragement_Home home = new Fragement_Home();
FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();
}
Шаг 2 После этого Я заменил фрагмент со следующим кодом:
Fragment_More moreFragment = new Fragment_More();
FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction().replace(R.id.frameContent, moreFragment).addToBackStack("more").commit();
Шаг 3: После этого я снова таким же образом добавлен еще один фрагмент на Fragment_More:
Fragment_AboutRockstand termsConditions = new Fragment_AboutRockstand();
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.frameContent, termsConditions).addToBackStack("about_rockstand").commit();
и вот активность моего фрагмента onBackPressedButton Lisetener:
@Override
public void onBackPressed() {
FragmentManager fm = getSupportFragmentManager();
Fragment f = fm.findFragmentById(R.id.frameContent);
if(fm.getBackStackEntryCount() > 1){
fm.popBackStack();
} else{
finish();
}
}
вот проблема, которую я получаю:
когда я нажимаю назад с шага 3, он дает мне предыдущий фрагмент успешно, как описано onBackPressed, он будет popbackstack и приведет меня к предыдущему фрагменту. Но из Fragment_More, когда я снова нажимаю назад, он показывает мне пустой Содержание фрагментов. Он никогда не показывает первый фрагмент, который я добавил на Шаге 1 в OnCreate действия.
прокомментируйте, пожалуйста. Что я делаю не так ?
спасибо
3 ответов
вы не должны добавлять свой первый фрагмент в backstack, так как нажатие клавиши возврата просто отменит действие, которое вы сделали. Поэтому, если вы замените фрагмент и нажмете назад, он отменит замену, которую вы сделали. Но если вы нажмете на кнопку и ... --1--> ' fragmenttransaction, он просто удалит его и покажет вам пустую страницу. Поэтому я думаю, что удаление первого фрагмента из backstack должно сделать трюк. Попробуй и позволь мне. знать!
@Override
protected void onCreate(Bundle savedBundleState) {
super.onCreate(savedBundleState);
setContentView(R.layout.activity_base_new);
Fragement_Home home = new Fragement_Home();
FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction().add(R.id.frameContent, home).commit();
}
пример:
Итак, предположим, у вас есть два фрагмента под названием A & B
если вы .add()
фрагмент A на странице, и "addToBackStack()
" (=сохранить обратный действия) вы сохраните удалить фрагмент A как действие при нажатии на кнопку Назад.
если вы .replace()
фрагмент A фрагмент B, и "addToBackStack()
" вы будет сохранен remove B и добавить A как действие при нажатии на кнопку Назад.
Итак, вы видите, почему это не хорошая практика, чтобы добавить свой первый fragmenttransaction к backstack? Это просто приведет к удалению фрагмента A путем отжимать назад, приводящ к в пустой странице. Надеюсь, этого достаточно.
кроме того, как только вы удалили addToBackStack()
для вашего первого фрагмента вам не нужно переопределять onBackPressed()
, потому что он будет работать, как это предполагается. Он просто закончит работу, когда в backstack ничего не останется, не показав вам сначала эту пустую страницу.
ваши строки:
if(fm.getBackStackEntryCount() > 1){
должно быть:
if (fm.getBackStackEntryCount() > 0) {
вы кладете 3 фрагмента на backstack. После того, как вы вытащите первые две записи, количество записей на backstack затем равно 1. Таким образом, вы не можете получить первый фрагмент, который вы добавили в backstack.
вы используете эту
manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();
попробуйте использовать это вместо
manager.beginTransaction().replace(R.id.frameContent, home).addToBackStack("home").commit();
Дайте мне знать, если это работает для U