Веб-просмотр Google IMA не отображается при использовании внутри реагировать родной на Android
Вкратце: мы используем "реагируем на натив" на андроиде и используем нативный VideoView для показа видео с рекламой, используя Google IMA SDK для андроид. Видео воспроизводится, реклама воспроизводится, но веб-просмотр, содержащий "читать дальше" и "пропустить рекламу", не отображается. Он добавлен в иерархию представлений, но имеет размер 0,0 и не имеет дочерних элементов. Когда я использую точно такой же код в родном приложении. Все работает как положено.
Еще немного контекста:
- Интеграция видеоплеера / google ima sdk копируется прямо из примера приложения google ima.
- Когда компонент помещен в родное приложение для Android, все работает нормально.
- При просмотре иерархии представлений ясно, что веб-представление добавлено, и его размер равен 0,0.
- При добавлении нативного веб-просмотра он отображается отлично.
Соответствующий код из компонента React Native:
@SuppressLint("ViewConstructor")
public class ReactVideoViewWithAds extends FrameLayout implements
LifecycleEventListener {
private VideoPlayerWithAdPlayback mVideoPlayerWithAdPlayback;
private RelativeLayout mCompanionAdSlot;
private VideoPlayerController mVideoPlayerController;
public ReactVideoViewWithAds(ThemedReactContext themedReactContext) {
super(themedReactContext);
createViews();
themedReactContext.addLifecycleEventListener(this);
}
private void createViews() {
FrameLayout.LayoutParams companionAdLayoutParams = new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,
(int) (50 * getResources().getSystem().getDisplayMetrics().density));
companionAdLayoutParams.gravity = Gravity.CENTER_HORIZONTAL;
mCompanionAdSlot = new RelativeLayout(getContext());
mCompanionAdSlot.setBackgroundColor(Color.BLUE);
addView(mCompanionAdSlot, companionAdLayoutParams);
//player with ad playback
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT);
mVideoPlayerWithAdPlayback = new VideoPlayerWithAdPlayback(getContext());
addView(mVideoPlayerWithAdPlayback, layoutParams);
initPlayer();
}
private void initPlayer() {
mVideoPlayerController = new VideoPlayerController(
getContext(),
mVideoPlayerWithAdPlayback,
null,
null,
"nl",
mCompanionAdSlot,
null);
}
1 ответ
Этот вопрос имел решение в комментарии
При динамическом добавлении представлений в нативный компонент кажется, что вам нужно вручную запустить цикл макета, чтобы реагировать на изменения. (возможно, связано с реакцией нативного обновления на теневое представление)
@Override
public void requestLayout() {
super.requestLayout();
post(measureAndLayout);
}
private final Runnable measureAndLayout = new Runnable() {
@Override
public void run() {
measure(
MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.EXACTLY));
layout(getLeft(), getTop(), getRight(), getBottom());
}
};