Поведение onBackPressed с несколькими фрагментами - PullRequest
0 голосов
/ 09 января 2019

Я хочу переопределить пользовательское поведение для фрагмента.

У меня есть три разных фрагмента в моей деятельности. Два из них - это панель инструментов и баннер, поэтому я не хочу возвращаться к этим двум. Но в другом фрагменте я хочу переопределить пользовательское поведение при нажатии кнопки «Назад».

И кнопка «Назад» не является кнопкой «Назад» 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

Но фрагмент не обновляется, он все еще показывает тот же уровень.

1 Ответ

0 голосов
/ 09 января 2019

Просто попробуйте это ....

Просто добавьте метод .addToBackStack(null), когда вам нужно поведение назад, когда вы начинаете свой фрагмент, как показано ниже.

getSupportFragmentManager().beginTransaction().replace(R.id.layout_parent_id, new YourFragment()).addToBackStack(null).commit();

И не .addToBackStack(null) метод, когда вам не нужно обратное поведение.

Примечание: - вам не нужно ничего делать внутри вашего onBackPressed() метода.

...