我有一个包含 VideoView 的简单布局。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/black"
android:gravity="center" >
<VideoView
android:id="@+id/videoPlayer"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</RelativeLayout>
使用此布局的 Activity
创建一个 Fragment
来启动 VideoView
public class VideoPlayerActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_player);
createNewWorkerFragment();
}
private void createNewWorkerFragment() {
FragmentManager fragmentManager = getFragmentManager();
VideoPlayerActivityWorkerFragment workerFragment = (VideoPlayerActivityWorkerFragment)fragmentManager.findFragmentByTag(VideoPlayerActivityWorkerFragment.Name);
if (workerFragment == null) {
workerFragment = new VideoPlayerActivityWorkerFragment();
fragmentManager.beginTransaction()
.add(workerFragment, VideoPlayerActivityWorkerFragment.Name)
.commit();
}
}
}
VideoPlayerActivityWorkerFragment
如下:
public class VideoPlayerActivityWorkerFragment extends Fragment {
public static String Name = "VideoPlayerActivityWorker";
private VideoView mVideoPlayer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
mVideoPlayer = (VideoView) mActivity.findViewById(R.id.videoPlayer);
mVideoPlayer.setVideoPath(mActivity.getIntent().getExtras().getString("path"));
MediaController controller = new MediaController(mActivity);
controller.setAnchorView(mVideoPlayer);
mVideoPlayer.setMediaController(controller);
mVideoPlayer.requestFocus();
mVideoPlayer.start();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mActivity = activity;
}
@Override
public void onDetach() {
super.onDetach();
mActivity = null;
}
}
这是我遇到的问题,当 VideoPlayerActivity
启动时 VideoPlayerActivityWorkerFragment
被创建并且 VideoView
开始播放,但是当我旋转设备视频停止播放,整个 View
似乎从布局中消失了。由于 setRetainInstance(true);
,我认为 VideoView
会继续播放。有人可以让我知道我做错了什么吗?我在别处使用过这种模式(不是 VideoView
),它成功地实现了旋转。
我不愿意使用 android:configChanges="keyboardHidden|orientation|screenSize"
或类似的方法,我想用 Fragment
来处理方向变化。
预先感谢您的帮助。
编辑
我最终选择了我所做的解决方案,因为它有效。每次onCreateView都需要重新创建videoview和controller,在onResume中设置播放位置,在onPause中重新写入。但是,在旋转过程中播放时断断续续的。该解决方案不是最优的,但它确实有效。
最佳答案
参见 mVideoPlayer = (VideoView) mActivity.findViewById(R.id.videoPlayer);
您的 VideoView
是由正在被销毁并在旋转时重新创建的 Activity 创建的。这意味着正在创建一个新的 R.id.videoPlayer
VideoView。所以你的本地 mVideoPlayer
只是在你上面的行中被覆盖了。您的 fragment 需要在其 onCreateView() 方法中创建 VideoView
。即便如此,这可能还不够。因为 Views 与它们拥有的 Context 有着内在的联系。也许一个明确的暂停、检测和附加、播放 View 将是一个更好的方法。
关于android - 保留 fragment 不保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17513763/