2013-10-09 8 views
6

Ich habe ein Problem bezüglich der Position eines MediaController für eine VideoView innerhalb einer Fragment festgestellt. Hier ein Screenshot, wie es aussieht auf dem Nexus 7 mit Android 4.3: Screenshot of app with MediaController on 4.3Position MediaController in einem Fragment

Und hier ist ein Screenshot der App auf dem Nexus 7 mit Android 4.2.2: enter image description here

Wie Sie sehen können, die Position Der MediaController befindet sich mitten in meiner Aktivität auf API 17 oder niedriger (getestet auf einem anderen Tablet mit 4.1.2). Mir ist aufgefallen, dass die Größe des MediaControllers korrekt ist.

Mein Fragment wird in einem FrameLayout angezeigt, dessen Breite durch sein Gewicht (hier 0,6) definiert ist, also nicht durch einen bestimmten dpi-Wert.

Ich habe den Quellcode von MediaController auf Grepcode überprüft und den von 4.3 mit dem Code von 4.2.2 verglichen und es gibt einige kleine Änderungen mit den LayoutParams, aber ich kann keinen Weg finden, dies zu machen .

ich initialisieren meine Videoview und MediaController- im onActivityCreated() meines Fragment

mMediaController = new MediaController(getActivity()); 
mMediaController.setAnchorView(videoView); 
videoView.setMediaController(mMediaController); 

Kennt jemand, wie ich es für richtig positionieren kann?

Antwort

2

Zunächst einmal müssen wir individuelle MediaController- es ist seltsam Verhalten in android vor 4,3

class CustomMediaController extends MediaController 
{ 

    public CustomMediaController(Context context) { 
     super(context); 
    } 

    public CustomMediaController(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    } 

    public CustomMediaController(Context context, boolean useFastForward) { 
     super(context, useFastForward); 
    } 

    @Override 
    public void show(int timeout) { 
     super.show(timeout); 
     int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
     if (currentapiVersion < 18) //android.os.Build.VERSION_CODES.JELLY_BEAN_MR2 
     { 
      try { 
       Field field1 = MediaController.class.getDeclaredField("mAnchor"); 
       field1.setAccessible(true); 
       View mAnchor = (View)field1.get(controller); 

       Field field2 = MediaController.class.getDeclaredField("mDecor"); 
       field2.setAccessible(true); 
       View mDecor = (View)field2.get(controller); 

       Field field3 = MediaController.class.getDeclaredField("mDecorLayoutParams"); 
       field3.setAccessible(true); 
       WindowManager.LayoutParams mDecorLayoutParams = (WindowManager.LayoutParams)field3.get(controller); 

       Field field4 = MediaController.class.getDeclaredField("mWindowManager"); 
       field4.setAccessible(true); 
       WindowManager mWindowManager = (WindowManager)field4.get(controller); 

       int [] anchorPos = new int[2]; 
       mAnchor.getLocationOnScreen(anchorPos); 

       // we need to know the size of the controller so we can properly position it 
       // within its space 
       mDecor.measure(MeasureSpec.makeMeasureSpec(mAnchor.getWidth(), MeasureSpec.AT_MOST), 
           MeasureSpec.makeMeasureSpec(mAnchor.getHeight(), MeasureSpec.AT_MOST)); 

       WindowManager.LayoutParams p = mDecorLayoutParams; 
       p.width = mAnchor.getWidth(); 
       p.x = anchorPos[0] + (mAnchor.getWidth() - p.width)/2; 
       p.y = anchorPos[1] + mAnchor.getHeight() - mDecor.getMeasuredHeight(); 
       mWindowManager.updateViewLayout(mDecor, mDecorLayoutParams); 

      } catch (Exception e) { 
        e.printStackTrace(); 
      } 
     } 
    } 
} 

Dann ersetzen Sie einfach MediaController- in Variablendeklaration mit CustomMediaController und alles zu ändern, tun wird. Der Grund ist, dass der Android-Code vor 4.3 abgehört wurde. Wir verwenden die Reflektion, um die Position in show() Methode zu korrigieren.

Getestet mit Android 4.0.

+0

Was ist das "Controller" -Objekt? – kmas

+0

Was ist der Controller? – delive

Verwandte Themen