Intereting Posts
Какие юниты проходят методы пользовательского интерфейса? Как добавить мое приложение Android в список отправки? Как конвертировать время с GMT по EST Откройте приложение Google Maps из браузера со стартовым местоположением по умолчанию на Android и iphone Почему добавление if-statement внутри этого метода значительно замедляет его? Как фильтровать ListView с помощью getFilter () в BaseAdapter Всегда показывать полосу прокрутки для ListView Как автоматически удалить приложение Android с устройства перед установкой новой версии Как получить данные из курсора в ContextMenu Щелкните элемент списка ListView, который не отвечает Что означает три точки в «doInBackground (URL … urls)»? Android Gridview и кнопка OnItemclick Есть ли способ отключить / отредактировать затухание, которое имеет вид списка по краям? Разработчик приложений Google: измените язык по умолчанию для приложения Недопустимый вектор векторных меток – appcompat-v7: 24.1.1

Положение MediaController внутри фрагмента

Я заметил проблему, связанную с позицией MediaController для VideoView внутри Fragment . Вот скриншот о том, как он выглядит на Nexus 7 под управлением Android 4.3: Скриншот приложения с MediaController на 4.3

И вот скриншот приложения на Nexus 7 под управлением Android 4.2.2: Введите описание изображения здесь

Как вы можете видеть, позиция 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); 

Кто-нибудь знает, как я могу правильно это сформулировать?

Прежде всего, нам понадобится специальный 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(); px = anchorPos[0] + (mAnchor.getWidth() - p.width) / 2; py = anchorPos[1] + mAnchor.getHeight() - mDecor.getMeasuredHeight(); mWindowManager.updateViewLayout(mDecor, mDecorLayoutParams); } catch (Exception e) { e.printStackTrace(); } } } } - 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(); px = anchorPos[0] + (mAnchor.getWidth() - p.width) / 2; py = anchorPos[1] + mAnchor.getHeight() - mDecor.getMeasuredHeight(); mWindowManager.updateViewLayout(mDecor, mDecorLayoutParams); } catch (Exception e) { e.printStackTrace(); } } } } 

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

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