片段生命周期 - 在显示/隐藏时调用哪个方法?

Phi*_*oda 95 lifecycle android android-fragments fragmenttransaction

我使用以下方法通过显示/隐藏它们来切换片段(在我的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;
    }
Run Code Online (Sandbox Code Playgroud)

我不清楚的是当我显示或隐藏它时,会调用Fragments生命周期的哪个方法?(因为没有像onShow()或onHide()这样的方法,我不太清楚要使用什么).我想在显示和隐藏某个片段时执行特定操作.

ser*_*nka 112

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

根据您的布局onStart(),当您的Fragment尚未显示时,Android可以调用,但它属于可见的父容器.例如,这有效android.support.v4.view.ViewPager,需要您覆盖Fragment.setUserVisibleHint()方法.在任何情况下,如果您需要注册/取消注册BroadcastReceivers或其他侦听器,您可以安全地使用onStart()onStop()方法,因为它们将始终被调用.

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

更新:如果您使用,android.support.v4.widget.DrawerLayout则抽屉下方的片段保持开始并且即使在抽屉打开时也可见.在这种情况下,您需要使用DrawerLayout.setDrawerListener()和监听onDrawerClosed()onDrawerOpened()回调.

  • 当片段使用事务变得不可见时,不会调用`onStop`和`onPause`.然而,"onHiddenChanged"被称为s1rius回答 (12认同)

小智 60

我@Override这个方法并解决了我的问题:

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


Bir*_*dia 35

当然你可以@Overriede以下方法来做到这一点:

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

  • setUserVisibleHint可用于视图分页器,但不能用于常规片段容器。 (2认同)

hoi*_*hoi 5

您可以使用“onCreateView”(或“onActivityCreated”)和“onHiddenChanged”。第一次显示时使用“onCreateView”,稍后显示时使用“onHiddenChanged”。事务控制时不会调用“setMenuVisibility”。

@Override
public View OnCreateView() {
   // fragment will show first
}

@Override
public void onHiddenChanged(boolean hidden) {
    if (!hidden) {
        // fragment will show 
    }
    else {
        // fragment will hide
    }
}
Run Code Online (Sandbox Code Playgroud)