расположить Медиаконтроллер внутри фрагмента

Я заметил проблему, касающуюся положения MediaController на VideoView внутри Fragment. Вот скриншот, как это выглядит на Nexus 7 под управлением Android 4.3: Screenshot of app with MediaController on 4.3

и вот скриншот приложения на Nexus 7 под управлением Android 4.2.2: enter image description here

как вы можете видеть, положение MediaController находится в середине моей деятельности на API 17 или ниже (протестировано на другом планшете с 4.1.2). Я заметил, что размер MediaController правильно.

мой фрагмент отображается в FrameLayout, ширина которого определяется его весом (0.6 здесь), а не определенным значением dpi.

Я проверил исходный код MediaController на Grepcode и сравнил один из 4.3 с кодом 4.2.2, и есть некоторые небольшие изменения с LayoutParams, но я не могу найти способ сделать эту работу.

Я инициализирую свой VideoView и MediaController в onActivityCreated () моего Фрагмент

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

кто-нибудь знает как я могу позиционировать?

1 ответов


прежде всего, нам понадобится пользовательский MediaController, чтобы изменить его странное поведение в Android до 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();
            }
        }
    }
}

затем просто замените MediaController в объявлении переменной на CustomMediaController, и все будет сделано. Причина код Android до 4.3 донимают. Мы используем отражение, чтобы исправить положение в show () метод.

протестировано с android 4.0.