Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

VideoView inside fragment causes black screen flicking

Tags:

We have an Android application running on Android API 4.0. One of the activities has a layout that divides the screen in 2 parts. On the left side we have a static part with some buttons. On the right side we have a FrameLayout that will switch to the corresponding fragment depending on the button that is pressed.

Problem: One of the fragments on the right side contains a VideoView. When the user clicks on the button to show this fragment the fragment is shown and the video immediately starts playing however: upon rendering this fragment the complete screen flickers in black which is very annoying.

Here is some code of the VideoFragment class:

public class VideoFragment extends Fragment {      public VideoView videoView;      private ExternalVideo mVideo;     private boolean mVideoExists;     private String mDestination;      @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         mDestination = ApplicationParams.MEDIA_STORAGE_PATH + "videos/"                 + FilenameUtils.getBaseName(((DetailActivity)getActivity()).getProduct().getVideoUrl())                 + "."                 + FilenameUtils.getExtension(((DetailActivity) getActivity()).getProduct().getVideoUrl());          File file = new File(mDestination);         mVideoExists = file.exists() && file.isFile();     }      @Override     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {         View view;          if (mVideoExists) {             getActivity().getWindow().setFormat(PixelFormat.TRANSLUCENT);             view = inflater.inflate(R.layout.video, null);             mVideo = new ExternalVideo(mDestination);              videoView = (VideoView) view.findViewById(R.id.video_video);              MediaController mediaController = new MediaController(getActivity());             mediaController.setAnchorView(videoView);              videoView.setMediaController(mediaController);             videoView.setVideoPath(mVideo.getFullPath());             videoView.requestFocus();             videoView.setVisibility(View.VISIBLE);              videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {                 public void onPrepared(MediaPlayer mp) {                     videoView.start();                  }             });         } else {             TextView textView = new TextView(getActivity());             textView.setText(getActivity().getString(R.string.videofragment_video_coming_soon));             textView.setPadding(50, 50, 50, 50);             view = textView;         }          return view;     }  } 

Here is the layout of the video fragment:

<?xml version="1.0" encoding="utf-8"?>  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"               android:layout_width="match_parent"               android:layout_height="match_parent">     <VideoView android:id="@+id/video_video"                android:layout_width="fill_parent"                android:layout_alignParentRight="true"                android:layout_alignParentLeft="true"                android:layout_alignParentTop="true"                android:layout_alignParentBottom="true"                android:layout_height="fill_parent"/> </RelativeLayout> 

Does anyone have an idea what could be causing this flickering issue upon rendering the fragment that contains the VideoView? A solution would be appreciated!

EDIT1: If I click on the fragment where the VideoView is on the screen flickers in the beginning. When I then navigate to anoter fragment and go back to the one containing the VideoView the flicker is gone.

like image 221
Kenny Avatar asked Jul 18 '13 08:07

Kenny


1 Answers

I was able to fix this by adding a 0px by 0px SurfaceView in the layout of the parent activity of the fragment:

<SurfaceView         android:layout_width="0px"         android:layout_height="0px" /> 
like image 146
Kenny Avatar answered Sep 20 '22 14:09

Kenny