检测FragmentStatePagerAdapter的片段子调用onViewCreated方法

时间:2017-04-20 00:20:36

标签: android android-fragments android-viewpager fragmentstatepageradapter

我已经附加了FragmentStatePagerAdapter的ViewPager。每个孩子都是片段。每当我从页面滚动或关闭时,我都需要调用几种方法。这就是我到目前为止所做的:

    mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        int mCurrentPosition = -1;

        @Override
        public void onPageSelected(int newPosition) {
            super.onPageSelected(newPosition);

            FullScreenAssetFragment newPage = (FullScreenAssetFragment) mAdapter.getItem(newPosition);
            newPage.onFragmentScrolledIn();

            if (mCurrentPosition >= 0) {
                FullScreenAssetFragment oldPage = (FullScreenAssetFragment) mAdapter.getItem(mCurrentPosition);
                oldPage.onFragmentScrolledOff();
            }

            mCurrentPosition = newPosition;
        }
    });

然后在每个片段中我实现了这些方法:

/**
 * Called when this Fragment is hidden from the ViewPager, because we scrolled off to another
 * page.
 */
public void onFragmentScrolledOff() {
    if (mVideoView != null && mVideoView.isPlaying()) {
        mVideoView.stopPlayback();
    }
    if (mMediaController != null) {
        mMediaController.setVisibility(View.GONE);
    }
}

/**
 * Called when this Fragment is shown in the ViewPager
 */
public void onFragmentScrolledIn() {
    if (mVideoView != null && !mVideoView.isPlaying()) {
        mVideoView.start();
    }
    if (mMediaController != null) {
        mMediaController.setVisibility(View.VISIBLE);
    }
}

正如您可能猜到的,问题在于我的每个片段中都有一个VieoView,我在其中显示视频,我想在滚动到另一个页面时停止这些视频。但这不是主要观点,我可能会因其他原因检测滚动更改。因此任何特定的视频相关解决方案都没有用。我想要的是在执行Fragment的onViewCreated方法之后调用onFragmentScrolledOff / onFragmentScrolledIn上的那些方法。碰巧我有一个我通过Fragment的Bundle设置的变量,当我执行onFragmentScrolledIn方法时,变量为null,这意味着onViewCreated方法还没有被调用。我希望在调用onFragmentScrolledOff / onFragmentScrolledIn方法时,100%确定之前已经调用了onViewCreated方法。

关于如何实现这一目标的任何建议?

1 个答案:

答案 0 :(得分:0)

在FragmentStatePagerAdapter类中覆盖getItemPosition方法,返回PagerAdapter.POSITION_NONE。在片段onFragmentScrolledIn()上拨打onCreateView,在片段onFragmentScrolledOff()方法上拨打onDetach()