片段生命周期 – 显示/隐藏哪个方法?

我正在使用以下方法通过显示/隐藏片段(在我的NavigationDrawer)之间切换。

protected void showFragment(int container, Fragment fragment, String tag, String lastTag, boolean addToBackStack ) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); if ( lastTag != null && !lastTag.equals("")) { Fragment lastFragment = fragmentManager.findFragmentByTag( lastTag ); if ( lastFragment != null ) { transaction.hide( lastFragment ); } } if ( fragment.isAdded() ) { transaction.show( fragment ); } else { transaction.add( container, fragment, tag ); } if ( addToBackStack ) { transaction.addToBackStack( tag ); } transaction.commit(); // set the active tag activeFragTag = tag; } 

我不清楚Fragments生命周期的哪个方法在显示或隐藏时调用? (因为没有方法,如onShow()或onHide()即时通讯不太确定什么tuse)。 我想在展示和隐藏特定片段时采取特定的行动。

与活动生命周期类似,当fragment变为可见时,Android调用onStart() 。 当片段变得不可见时, onStop()通常被调用,但是它也可以在以后被调用。

根据你的布局,当你的Fragment不可见时,Android可以调用onStart() ,但它属于一个可见的父容器。 例如,这对android.support.v4.view.ViewPager是有效的,它要求你重写Fragment.setUserVisibleHint()方法。 无论如何,如果您需要注册/注销BroadcastReceivers或其他监听器,则可以安全地使用onStart()onStop()方法,因为这些方法将始终被调用。

注:一些片段容器可以保持不可见的片段启动。 要处理这种情况,你可以覆盖Fragment.onHiddenChanged(boolean hidden) 。 根据文档 ,片段必须启动并且可见(不隐藏) ,以便用户可见。

更新:如果使用android.support.v4.widget.DrawerLayout那么抽屉下面的一个片段保持启动状态,即使在抽屉打开时也是可见的。 在这种情况下,您需要使用DrawerLayout.setDrawerListener()并侦听onDrawerClosed()onDrawerOpened()callback。

我@覆盖此方法并解决我的问题:

 @Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); if (hidden) { //do when hidden } else { //do when show } } 

你可以@Overriede下面的方法来做到这一点:

 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { // Do your Work } else { // Do your Work } } 

onCreateView之前调用setUserVisibleHint 。 而且你不能更新我使用的setUserVisibleHint里面的任何View

 public void setMenuVisibility(final boolean visible) 

可视性和onHiddenChanged()没有第一次调用 。 它会在隐藏状态发生变化时调用。 因为一个fragment is visible by default 。 为了实现这个方法第一次你必须调用mFragmentTransaction.hide(oldFragment)那么它将工作

注意

如果你想使用setUserVisible提示并更新View 使用这个方法

试试这个代码:

 @Override public void setUserVisibleHint(boolean visible) { super.setUserVisibleHint(visible); if (visible && isResumed()) { onResume(); } } @Override public void onResume() { super.onResume(); if (!getUserVisibleHint()) { return; } //Add your code this section } 

只要在你的setUserVisibleHint()

 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if(isVisibleToUser && getView() != null){ isActive = true; init(); }else if(isVisibleToUser && getView() == null){ isActive = false; }else{ isActive = true; } } 

并在onCreateView()中创build此代码:

 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { if(!isActive){ init(); } }