Я хочу переопределить пользовательское поведение для фрагмента.
У меня есть три разных фрагмента в моей деятельности. Два из них - это панель инструментов и баннер, поэтому я не хочу возвращаться к этим двум. Но в другом фрагменте я хочу переопределить пользовательское поведение при нажатии кнопки «Назад».
И кнопка «Назад» не является кнопкой «Назад» Android, это другая кнопка, которую я создал для первого фрагмента: панель инструментов, когда пользователь нажимает на кнопку «Назад», фрагменты запускают метод интерфейса. Просто так:
mListener.onToolbarInteraction(v);
Я попытался переопределить метод onBackPressed () Android и написал свой код. Кроме того, я установил тег на фрагмент, который я хочу, чтобы указанное поведение, но не в других двух.
Это XML действия:
.XML:
<fragment
android:id="@+id/fm_toolbar"
android:layout_width="800dp"
android:layout_height="wrap_content"
class="com.iurban.restaurant.Fragments.MainFragment"/>
<fragment
android:id="@+id/fl_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@color/alphaBlack"
app:layout_constraintTop_toBottomOf="@id/fm_toolbar"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintBottom_toTopOf="@id/fm_banner"
class="com.iurban.restaurant.Fragments.MainFragment"/>
<fragment
android:id="@+id/fm_banner"
android:layout_width="800dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
class="com.iurban.restaurant.Fragments.MainFragment"/>
Это методы для инициации фрагментов:
Метод инициирования:
private void startMenu(short idFather){
MainFragment mainFragment = new MainFragment(getApplicationContext(), usedLang.getId(), idFather);
fragmentManager.beginTransaction()
.replace(R.id.fl_container, mainFragment)
.addToBackStack(CustomConstants.LEVEL)
.commit();
}
private void startToolbar(){
ToolbarFragment toolbarFragment = new ToolbarFragment(usedLang);
getSupportFragmentManager().beginTransaction()
.replace(R.id.fm_toolbar,toolbarFragment)
.show(fmToolbar)
.commit();
}
private void startBanner(){
BannerDAO bannerDAO = new BannerDAO(getApplicationContext());
Banner banner = bannerDAO.obtainingUniqueBanner();
if(banner != null && banner.getActive() == 1){
BannerFragment bannerFragment = new BannerFragment(banner, getApplicationContext(), (byte)usedLang.getId());
getSupportFragmentManager().beginTransaction()
.replace(R.id.fm_banner,bannerFragment)
.show(fmBanner)
.commit();
}else{
getSupportFragmentManager().beginTransaction()
.hide(fmBanner)
.commit();
}
}
это на спине нажата переопределена:
@Override
public void onBackPressed() {
int count = getSupportFragmentManager().getBackStackEntryCount();
if (count > 1) {
super.onBackPressed();
}
}
Поведение, которое я ожидал, - это навигация по списку уровней. Во фрагменте меню у вас есть обзор реселлера, и когда вы нажимаете / нажимаете на элемент, то вы «переходите на следующий уровень», и он показывает список дочерних элементов элемента, на который вы щелкнули. Поэтому, когда вы нажимаете назад, я ожидал, что приложение вернется к последнему списку, но у меня есть результат (переход к меню третьего уровня):
- вы нажимаете один раз, ничего не происходит.
- Вы нажимаете в другой раз и возвращаетесь на 1 уровень.
- Отсюда ничего не происходит, когда вы нажимаете.
Я просто понимаю (печатая логи), что обратный стек обновлен, но фрагмент не обновлен.
Я написал этот метод для печати идентификаторов заднего стека:
private void printStack(){
int count = getSupportFragmentManager().getBackStackEntryCount();
Log.e("BACKSTACK","-----------------------------------------------");
for(int i = 0; i < count; i++){
Log.e("BACKSTACK",String.valueOf(getSupportFragmentManager().getBackStackEntryAt(i).getId()));
}
}
Когда я нажимаю кнопку «Назад» (на третьем уровне меню), метод печати журналов распечатывается следующим образом:
- E / BACKSTACK: 0
- E / BACKSTACK: 1
- E / BACKSTACK: 2
и после super.onBackPressed (); печатает это:
- E / BACKSTACK: 0
- E / BACKSTACK: 1
Но фрагмент не обновляется, он все еще показывает тот же уровень.