下面是我的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)