我正在维护一个碎片堆栈,并在按下后退按钮时弹出堆栈.每次片段可见时我都需要重新加载数据,并在隐藏时进行一些清理.为此,我需要检测何时显示和隐藏片段.这是一个非常常见的问题,但令人惊讶的是,没有一个可接受的答案适合我.一世

我正在使用这样的代码向反向堆栈添加片段:

public void pushFragment(Fragment f) {

getFragmentManager().beginTransaction()

.add(R.id.content_frame,f,null)

.addToBackStack(null)

.commit();

}

我正在使用此代码弹出片段:

public void onBackPressed() {

if (getFragmentManager().getBackStackEntryCount() > 1) {

getFragmentManager().popBackStack();

} else {

super.onBackPressed();

}

}

我试图从片段类中检测它何时变得可见或隐藏(或者因为它从堆栈中弹出或者另一个片段被推到顶部).到目前为止,我已经尝试过这些回调:

> onViewCreated / onDestroyView:仅在将片段添加到堆栈并从堆栈弹出时调用.当片段由于堆栈上的其他片段而隐藏或可见时,不会调用.

> onHiddenChanged:从未打过电话.很多人都说过这样有效.但由于某种原因不适合我.

> setUserVisibleHint:从未调用过

> onStart / onPause等:它们并不真正适用于此,因为它们只是反映了主机活动的生命周期.

是否有片段回调可以让我检测片段何时被显示或隐藏?我宁愿不使用backstack监听器,因为我希望每个片段类都有自己的show / hide逻辑.

编辑:

如果我使用replace()添加片段(而不是add()),那么之前显示的片段的视图将被销毁.因此,如果该片段再次出现在堆栈顶部,则会重新创建其视图.在这种情况下,每次显示或隐藏片段时都会调用onViewCreated / onDestroyView或onStart / onStop.我想我可以使用这种方法.缺点是视图经常被创建和销毁.在这种情况下,我不妨使用活动而不是片段来进行主细节导航.

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐