У меня есть простой макет, содержащий 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
s.
Заранее благодарим вас за помощь.
Изменить
Я решил выбрать решение, которое я сделал, потому что он работает. Видеовизу и контроллер необходимо воссоздавать каждый раз, когда вызывается onCreateView, и положение воспроизведения должно быть установлено в onResume и повторно записано в onPause. Однако во время вращения воспроизведение прерывается. Решение не оптимально, но оно работает.