在 Popbackstack() 上调用方法

Posted

技术标签:

【中文标题】在 Popbackstack() 上调用方法【英文标题】:Call a method on Popbackstack() 【发布时间】:2021-11-02 09:17:07 【问题描述】:

我用 Fragment-B 替换 Fragment-A,在 Fragment-B 中调用 popbackstack() 时,我将重定向回 Fragment-A。所以我想调用一个方法来更新列表。

【问题讨论】:

【参考方案1】:

add 和 replace 的另一个重要区别是:replace 删除现有片段并添加新片段。这意味着当您按下返回按钮时,将创建被替换的片段并调用其 onCreateView。而 add 保留现有片段并添加一个新片段,这意味着现有片段将处于活动状态并且它们不会处于“暂停”状态,因此当按下后退按钮时不会为现有片段调用 onCreateView(在新片段之前存在的片段添加了片段)。对于fragment的生命周期事件onPause、onResume、onCreateView等生命周期事件,replace时会被调用,add时不会被调用。

简而言之,您需要使用 add ,如果您不希望片段视图重叠,则可以将片段 B 视图背景颜色替换为纯色而不是透明。

当您添加片段时,您还必须将其添加到片段的后台堆栈中。

FragmentTransaction ft = getSupportFragmentManager.beginTransaction();
                  ft.replace(R.id.content, fragment, backStateName);
                  ft.addToBackStack(backStateName);
                  ft.commit();

(这里 R.id.content 是您活动中的片段容器)

然后您必须在包含您的片段的活动中覆盖 onBackPressed 方法。

@Override
public void onBackPressed() 
 if (getSupportFragmentManager().getBackStackEntryCount() > 1) 
                 getSupportFragmentManager().popBackStack();
  

如果您想自定义您的 onBackPressed,那么您可以检查您的活动中当前可见的片段,并创建一个回调来执行该特定片段的操作。示例 -

    @Override
    public void onBackPressed() 
     if (getSupportFragmentManager().getBackStackEntryCount() > 1) 
              Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.content);
              if (fragment instanceof FragmentB) 
                            ((FragmentB) fragment).onBackPressed();
//                     getSupportFragmentManager().popBackStack();
      
    

现在您可以添加 getSupportFragmentManager().popBackStack();在 Fragment 的 onBackPressed() 方法中。

【讨论】:

以上是关于在 Popbackstack() 上调用方法的主要内容,如果未能解决你的问题,请参考以下文章

为啥popbackstack会调用fragment的onCreateView?

在 PopBackStack 之后片段弹出调用 OnViewCreated

popBackStack导致一次又一次调用片段的oncreateView

FragmentManager popBackStack 不删除片段

为 UIButton 调用发送方的方法

同步与异步,阻塞与非阻塞