片段生命周期 – 显示/隐藏哪个方法?
我正在使用以下方法通过显示/隐藏片段(在我的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(); } }