Intereting Posts
(Как) я могу увеличить ограничение квоты LocalStorage в Android WebView Как получить покрытие кода в Android с помощью Maven (android-maven-plugin) Android: getLastKnownLocation устаревший – как заставить обновление местоположения? Как мы можем обрабатывать ошибки HTTP, например: 401, 403, 404, 500 в android.webview? Как я могу заставить Mockito работать в androidTest Как я могу получить «сделанную» кнопку в softkeyboard? Внешний AndroidManifest.xml не отображается в панели просмотра проекта Обнаружить, что PopupMenu закрыт на уровне API 11 Android SDK – ошибка aapt: libstdc ++. So.6 не может открыть файл общих объектов Как изменить событие «Мое местоположение» с помощью API Google Maps android v2? Программный аксессуар для Android на Windows Android google maps добавляет собственный тег маркера Переключение пользователя или повторная аутентификация с помощью Instagram Как предотвратить задержку пользовательского интерфейса при обновлении уведомления при загрузке файла? Как получить дочерний вид ViewPager в заданном элементе

Положение 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); 

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

Solutions Collecting From Web of "Положение MediaController внутри фрагмента"

Прежде всего, нам понадобится специальный 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.