2012-05-17 7 views
10

У меня есть VideoView внутри настраиваемого диалога, и я создаю медиа-контроллер для VideoView на лету и назначая его VideoView в коде, однако контроллер не работает Фактически на экране появляется надпись - она ​​появляется за диалогом! Любая идея, как получить контроллер над видео?Android-MediaController VideoView внутри диалогового окна появляется за диалогом

Я создал статический диалоговое вспомогательный класс, чтобы помочь построить пользовательские диалоги:

public class DialogHelper { 

    public static Dialog getVideoDialog(Context context, Uri videoLocation, boolean autoplay) { 
     final Dialog dialog = getBaseDialog(context,true, R.layout.dialog_video); 

     ((Activity)context).getWindow().setFormat(PixelFormat.TRANSLUCENT); 
     final VideoView videoHolder = (VideoView) dialog.findViewById(R.id.video_view); 
     videoHolder.setVideoURI(videoLocation); 
     //videoHolder.setRotation(90); 
     MediaController mediaController = new MediaController(context); 
     videoHolder.setMediaController(mediaController); 
     mediaController.setAnchorView(videoHolder); 
     videoHolder.requestFocus(); 
     if(autoplay) { 
      videoHolder.start(); 
     } 
     videoHolder.setOnCompletionListener(new OnCompletionListener() { 

      @Override 
      public void onCompletion(MediaPlayer mp) { 
       dialog.dismiss(); 

      } 
     }); 
     return dialog; 
    } 


    /** 
    * Creates a simple dialog box with as many buttons as you want 
    * @param context The context of the dialog 
    * @param cancelable whether the dialog can be closed/cancelled by the user 
    * @param layoutResID the resource id of the layout you want within the dialog 
    * 
    * @return the dialog 
    */ 
    public static Dialog getBaseDialog(Context context, boolean cancelable, int layoutResID) { 
     Dialog dialog = new Dialog(context, R.style.Theme_PopUpDialog); 
     dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     dialog.setCancelable(cancelable); 
     dialog.setCanceledOnTouchOutside(cancelable); 
     dialog.setContentView(layoutResID); 

     return dialog; 
    } 
} 

Так в моем Activity я просто это, чтобы создать свой диалог:

Dialog videoDialog = DialogHelper.getVideoDialog(context, Uri.parse("http://commonsware.com/misc/test2.3gp"), true); 
videoDialog.show(); 

ответ

3

Я полагаю, что вам нужно использовать Activity вместо Dialog. Задайте свою тему Activity, чтобы подражать Dialog в манифесте.

Пример - AndroidManifest.xml:

android:theme="@android:style/Theme.Dialog" 

Тогда вы будете иметь возможность отображать VideoView как в примерах.

2

Это работает для меня

в макете XML внести изменения, как это,

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <VideoView 
     android:id="@+id/videoview" 
     android:layout_width="640dp" 
     android:layout_height="400dp" 
     android:layout_centerInParent="true" > 
    </VideoView> 

     <FrameLayout 
      android:id="@+id/videoViewWrapper" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentBottom="true" > 
     </FrameLayout> 

    </RelativeLayout> 

в вашем dilog,

mVideoView = (VideoView) view.findViewById(R.id.videoview); 

в этом видео вид использования setOnPreparedListener слушателем и установить средства массовой информации контроллер,

mVideoView.setOnPreparedListener(new OnPreparedListener() { 

       @Override 
       public void onPrepared(MediaPlayer mp) { 
        // TODO Auto-generated method stub 
        mp.setOnVideoSizeChangedListener(new OnVideoSizeChangedListener() { 
         @Override 
         public void onVideoSizeChanged(MediaPlayer mp, 
           int width, int height) { 
          /* 
          * add media controller 
          */ 
          mc = new MediaController(MainActivity.this); 
          mVideoView.setMediaController(mc); 
          /* 
          * and set its position on screen 
          */ 
          mc.setAnchorView(mVideoView); 

          ((ViewGroup) mc.getParent()).removeView(mc); 

          ((FrameLayout) findViewById(R.id.videoViewWrapper)) 
            .addView(mc); 
          mc.setVisibility(View.VISIBLE); 
         } 
        }); 
        mVideoView.start(); 
       } 
      });