【问题标题】:Behavior of onBackPressed with multiple fragmentsonBackPressed 与多个片段的行为
【发布时间】:2019-01-09 11:45:51
【问题描述】:

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

我的 Activity 中有三个不同的片段。其中两个是工具栏和横幅,所以我不想回到这两个。但在另一个片段中,我想在按下后退按钮时覆盖自定义行为。

并且后退按钮不是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
  • 电子/后台:1
  • 电子/后台:2

在 super.onBackPressed(); 之后打印这个:

  • E/BACKSTACK:0
  • 电子/后台:1

但是片段没有更新,它仍然显示相同的级别。

【问题讨论】:

  • 试着把 if(count == 1)
  • 你对流量的解释不清楚。
  • @Ashish 它不起作用。

标签: android android-fragments back


【解决方案1】:

试试这个....

当您需要返回行为时,只需添加 .addToBackStack(null) 方法,当您像下面这样开始您的片段时。

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

当您不需要返回行为时,不要使用.addToBackStack(null) 方法。

注意:- 您不必在 onBackPressed() 方法中执行任何操作。

【讨论】:

  • 嗨 Sushil Kumar 我试过这个,如果你能看到我已经设置了 .addToBackStack(CustomConstants.LEVEL);在我想要 back 属性的片段上。无论如何,我也尝试了 null ,但它不起作用。
  • 您只有一项活动?当您按下返回按钮时,它不会显示任何内容? .
  • 我有两个活动。当应用程序启动时,它会在我下载数据时显示其他活动,然后应用程序会显示当前活动并构建片段
  • 那么,您想回到以前的 Back press 活动吗?
  • 不,这是因为我重写了 onBackPressed 方法,当返回堆栈计数为 1 时,我不想再返回。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多