Веб-просмотр 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());
        }
    };
Другие вопросы по тегам