刷新片段不再工作

Bra*_*oud 6 android fragment android-fragments android-support-library

我今天失去了几个小时,因为我的功能代码不再工作了.更新到支持库25.1.0的新版本后,重新加载片段视图的代码不再有效:

这是我的代码:

FragmentManager manager = getActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = manager.beginTransaction();
fragmentTransaction.detach(fragment);
fragmentTransaction.attach(fragment);
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

我试图调试一些断点

public void onPause()
public void onStop()
public void onAttach(Context context)
public void onDetach()  
public void onDestroyView()
public void onDestroy()
Run Code Online (Sandbox Code Playgroud)

但应用程序没有进入任何该功能,屏幕上没有任何反应.

如果我单独调用detach,没有附加,则应用程序进入onPause和onStop并且视图离开屏幕.

Vla*_*lad 6

我发现自己面临同样的问题,并没有在网上找到答案.最后,我发现在支持库的修订版25.1.1中的片段事务中添加了一些优化.(请参阅https://developer.android.com/topic/libraries/support-library/revisions.html#25-1-1).禁用您的交易将使其按预期工作:

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setAllowOptimization(false);
transaction.detach(fragment).attach(fragment).commitAllowingStateLoss();
Run Code Online (Sandbox Code Playgroud)

更新

setAllowOptimization已弃用.请setReorderingAllowed改用.

  • 为什么建议使用`commitAllowingStateLoss`而不仅仅是`commit`? (2认同)

小智 6

将 androidx.navigation 从 2.3.1 更新到2.3.2后遇到了类似的问题。

parentFragmentManager.beginTransaction().detach(this).attach(this).commit()
Run Code Online (Sandbox Code Playgroud)

已停止重新加载片段的视图。我在这里找到的一切都没有帮助,但我注意到分离和附加操作分别成功执行,我决定将它们的执行扩展到不同的 FragmentTransaction 实体:

parentFragmentManager.beginTransaction().detach(this).commit ()
parentFragmentManager.beginTransaction().attach(this).commit ()
Run Code Online (Sandbox Code Playgroud)

它奏效了。希望这可以节省一些时间。

  • 除了这个之外,其他解决方案都不适合我。确实节省了我的时间。多谢 (2认同)

Ali*_*Nem 5

@Viad 实际上回答了这个问题。补充一点,这发生在 android 版本 26 及更高版本中,默认情况下允许重新排序。当在同一个完成时请求两个片段操作时,重新排序开始起作用,例如添加片段 1 然后用片段 2 替换它,这只会导致后者(替换片段 2)发生。

因此,当默认情况下允许重新排序时,使用detach(fragment).attach(fragment)第一个重新启动片段时将忽略,只执行第二个。由于片段已经附加,attach(fragment)所以不做任何事情。这就是为什么没有调用片段的生命周期方法。

该问题的解决方案是setReorderingAllowed(false)停用重新排序。所以解决方案是:

                    FragmentTransaction transaction = mActivity.getFragmentManager()
                            .beginTransaction();
                    if (Build.VERSION.SDK_INT >= 26) {
                        transaction.setReorderingAllowed(false);
                    }
                    transaction.detach(fragment).attach
                            (fragment).commit();
Run Code Online (Sandbox Code Playgroud)