具有多个片段的onBackPressed的行为

时间:2019-01-09 11:45:51

标签: android android-fragments back

我想覆盖片段的自定义行为。

我的活动中有三个不同的片段。其中有两个是工具栏和横幅,因此我不想再讨论这两个。但是在另一个片段中,我想在按下后退按钮时覆盖自定义行为。

后退按钮不是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();
    }
}

我期望的行为是级别列表导航。在菜单片段中,您有一个recyclerview,当您单击/点击某个元素时,您将“进入下一个级别”,并且显示了您单击的元素的子代列表。因此,当您按回时,我希望该应用程序返回到最后一个列表,但是我得到的结果(转到第三级菜单)为:

  • 您点击一次,什么也没发生。
  • 您再点击一次,然后返回1级。
  • 点击此处从这里什么也没有发生。

我只是意识到(打印日志)后退堆栈已更新,但该片段未更新。

我编写了此方法来打印后退堆栈的ID:

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 :(得分:0)

只需尝试一下....

当您需要后退行为时(如下所示)开始添加.addToBackStack(null)方法。

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

当您不需要后退行为时,也不要使用.addToBackStack(null)方法。

注意:-您无需在onBackPressed()方法内做任何事情。