android - 保留 fragment 不保留

标签 android android-fragments android-videoview android-orientation

我有一个包含 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/

相关文章:

android - 程序类型已经存在 : com. android.internal.http.multipart.ByteArrayPartSource

android - 在Android中实现Singleton以便在 Activity 之间共享数据的正确方法是什么?

android - 如何检查 VideoView 是否包含视频?

使用视频 View 的 Android 视频流(视频 View 不会自动显示)

Android:手机摄像头分辨率会影响预处理结果吗

android - 运动事件问题

android - 使用 AndroidAnnotations 在 fragment 中注入(inject) View

安卓.view.InflateException : Binary XML file line #94: Error inflating class fragment

android - 何时在 Fragment 中调用 initLoader?

android - 在android videoview中播放一个mp4文件