FragmentStatePagerAdapter IllegalStateException:<myfragment>当前不在FragmentManager中

时间:2016-03-17 04:19:25

标签: android android-fragments android-viewpager

下面是我的FragmentPagerAdapterClass:

public class ViewPagerAdapter extends FragmentStatePagerAdapter {

  private final FragmentManager supportFragmentManager;
  private List<Fragment> list;

  public ViewPagerAdapter(FragmentManager supportFragmentManager, List<Fragment> list) {
    super(supportFragmentManager);
    this.supportFragmentManager = supportFragmentManager;
    this.list = list;
  }

  @Override
  public Fragment getItem(int position) {
    return list.get(position);
  }

  @Override
  public int getCount() {
    if (list == null) {
        return 0;
    }
    return list.size();
  }
}

我在另一个片段中将此适配器添加到viewPager:

 private updateVideoViewPager(List<Fragment> list){

    ViewPagerAdapter videosAdapter = new ViewPagerAdapter(((SuperActivity) activity).getSupportFragmentManager(), list);
    videosPager.setAdapter(videosAdapter);
    videosPager.removeOnPageChangeListener(onVideoPageChangeListener);
    videosPager.addOnPageChangeListener(onVideoPageChangeListener);
    videosPager.setCurrentItem(0);
}

这里我应该通过getSupportFragmentManager(),因为我使用的是Support4库。

List包含HomeVideoFragment。 以下是HomeVideoFragment的来源:

@SuppressLint("ValidFragment")
public class HomeVideosFragment extends Fragment {

private RelativeLayout parentView;
private boolean isVisibleToUser = false;
private ImageView playPauseIv;
private ImageView orientationIv;
private RelativeLayout overlaySubParentRl;
private RelativeLayout videoControlsRl;

/**
 * Maintains the state whether the video is preparing(-1) or playing(1) or paused(2)
 * or stopped(0)
 */
private int playingState = 9;
private ProgressBar progressBar;
private TextView statusTv;

private String videoUrl;
private boolean isVodUrl;

public HomeVideosFragment() {
}

public HomeVideosFragment(String videoUrl, boolean isVodUrl) {
    this.videoUrl = videoUrl;
    this.isVodUrl = isVodUrl;
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    if (parentView == null) {
        parentView = (RelativeLayout) inflater.inflate(R.layout.home_video_fragment, container, false);

        progressBar = (ProgressBar) parentView.findViewById(R.id.home_video_fragment_progress_bar);
        statusTv = (TextView) parentView.findViewById(R.id.home_video_fragment_status_tv);

        parentView.findViewById(R.id.home_video_overlay_parent_rl).setOnTouchListener(onTouchListener);
        overlaySubParentRl = (RelativeLayout) parentView.findViewById(R.id.home_video_overlay_sub_parent_rl);

        orientationIv = (ImageView) parentView.findViewById(R.id.home_video_fragment_orientation_iv);
        orientationIv.setOnClickListener(toggleOrientationLickListener);

        videoControlsRl = (RelativeLayout) parentView.findViewById(R.id.home_videos_control_rl);

        playPauseIv = (ImageView) parentView.findViewById(R.id.home_video_fragment_control_play_iv);
        playPauseIv.setOnClickListener(playPauseClickListener);
        HomeVideoManager.getInstance(getActivity(), null).setPlayPauseView(playPauseIv);
        loadVideo();

        hideOverlay();
    } else {
        if (parentView.getParent() != null) {
            ((ViewGroup) parentView.getParent()).removeView(parentView);
        }
    }

    return parentView;
}


private void loadVideo() {
    if (!isVisibleToUser) {
        return;
    }
    overlaySubParentRl.setVisibility(View.VISIBLE);
    playingState = -1;
    videoControlsRl.setVisibility(View.GONE);
    /*String cameraUrl = camera.getPlayUrl();
    if(!cameraUrl.contains("http")){
        cameraUrl = "android.resource://"+getActivity().getPackageName()+"/raw/"+cameraUrl.toLowerCase().replace(" ","_");
    }*/
    progressBar.setVisibility(View.VISIBLE);
    HomeVideoManager.getInstance(getActivity(), videoListener).initiateVideoView(videoUrl, isVodUrl, parentView);
    statusTv.setText("");
}

@Override
public void onStart() {
    super.onStart();
    FlurryAgent.onStartSession(getActivity());
}

@Override
public void onDestroy() {
    super.onDestroy();
    FlurryAgent.onEndSession(getActivity());
}

private final HomeVideoManager.VideoListener videoListener = new HomeVideoManager.VideoListener() {
    @Override
    public void onPrepared() {
        progressBar.setVisibility(View.GONE);
        videoControlsRl.setVisibility(View.VISIBLE);
        playingState = 1;
    }

    @Override
    public void onError() {
        progressBar.setVisibility(View.GONE);
        videoControlsRl.setVisibility(View.GONE);
        statusTv.setText("Unable to play video.");
        playingState = 0;
    }
};

private final View.OnClickListener playPauseClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        if (playingState == 1) {
            HomeVideoManager.getInstance(getActivity(), videoListener).pause();
            playPauseIv.setImageResource(R.drawable.play);
            playingState = 2;
        } else if (playingState == 2) {
            HomeVideoManager.getInstance(getActivity(), videoListener).resume();
            playPauseIv.setImageResource(R.drawable.pause);
            playingState = 1;
        }
    }
};

private final View.OnClickListener toggleOrientationLickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (((HomeActivity) getActivity()).currentOrientation == Configuration.ORIENTATION_PORTRAIT) {
            getActivity().setRequestedOrientation(Build.VERSION.SDK_INT < 9 ?
                    ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE :
                    ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
        } else if (((HomeActivity) getActivity()).currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
            getActivity().setRequestedOrientation(Build.VERSION.SDK_INT < 9 ?
                    ActivityInfo.SCREEN_ORIENTATION_PORTRAIT :
                    ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
        }
    }
};

private final View.OnTouchListener onTouchListener = new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        if (event.getAction() == MotionEvent.ACTION_CANCEL) {
            overlaySubParentRl.setVisibility(View.VISIBLE);
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            if (overlaySubParentRl.getVisibility() == View.VISIBLE) {
                overlaySubParentRl.setVisibility(View.GONE);
            } else if (overlaySubParentRl.getVisibility() == View.GONE) {
                overlaySubParentRl.setVisibility(View.VISIBLE);
            }
        }
        return true;
    }
};

public void changeOrientationRes(int res) {
    orientationIv.setImageResource(res);
}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    this.isVisibleToUser = isVisibleToUser;
    if (parentView == null) {
        return;
    }
    if (isVisibleToUser) {
        loadVideo();
        hideOverlay();
    } else {
        progressBar.setVisibility(View.GONE);
    }
}

public void hideOverlay() {
    overlaySubParentRl.setVisibility(View.GONE);
}

public void showOverlay() {
    overlaySubParentRl.setVisibility(View.VISIBLE);
}

  }

我发现了许多解决方案,但我没有得到保存片段状态在哪里销毁.Below是我的strackTrace:

       ava.lang.IllegalStateException: Fragment HomeVideosFragment{54ad23f} is not currently in the FragmentManager
      03-16 08:26:33.173 E/AndroidRuntime(22923):         
  at                                                                          android.support.v4.app.FragmentManagerImpl.saveFragmentInstanceState(FragmentM   anager.java:687)
03-16 08:26:33.173 E/AndroidRuntime(22923):     at android.support.v4.app.FragmentStatePagerAdapter.destroyItem(FragmentStatePagerAdapter.java:136)
03-16 08:26:33.173 E/AndroidRuntime(22923):     at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:418)
03-16 08:26:33.173 E/AndroidRuntime(22923):     at com.selfhelp.fragments.NewsFragment.updateHomeVideoOnUI(NewsFragment.java:456)
03-16 08:26:33.173 E/AndroidRuntime(22923):     at com.selfhelp.fragments.NewsFragment.access$300(NewsFragment.java:62)
03-16 08:26:33.173 E/AndroidRuntime(22923):     at com.selfhelp.fragments.NewsFragment$HomeVideosAsyncTask.onPostExecute(NewsFragment.java:445)
03-16 08:26:33.173 E/AndroidRuntime(22923):     at com.selfhelp.fragments.NewsFragment$HomeVideosAsyncTask.onPostExecute(NewsFragment.java:368)
03-16 08:26:33.173 E/AndroidRuntime(22923):     at android.os.AsyncTask.finish(AsyncTask.java:651)
03-16 08:26:33.173 E/AndroidRuntime(22923):     at android.os.AsyncTask.-wrap1(AsyncTask.java)
03-16 08:26:33.173 E/AndroidRuntime(22923):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
03-16 08:26:33.173 E/AndroidRuntime(22923):     at android.os.Handler.dispatchMessage(Handler.java:102)
03-16 08:26:33.173 E/AndroidRuntime(22923):     at android.os.Looper.loop(Looper.java:148)
03-16 08:26:33.173 E/AndroidRuntime(22923):     at android.app.ActivityThread.main(ActivityThread.java:5417)
03-16 08:26:33.173 E/AndroidRuntime(22923):     at java.lang.reflect.Method.invoke(Native Method)
03-16 08:26:33.173 E/AndroidRuntime(22923):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
03-16 08:26:33.173 E/AndroidRuntime(22923):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

0 个答案:

没有答案