ViewPagerAdapter: воспроизведение видео на YouTube остановлено из-за несанкционированного наложения поверх проигрывателя

Задавая этот вопрос, потому что я не нашел решения/предложений после нескольких часов поиска. Все отвеченные решения с Fragment. Что я ищу ViewPagerAdapter и FrameLayout.

Мой ViewPagerAdapter xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<LinearLayout
    android:id="@+id/promotion_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/some_image"
        android:layout_width="match_parent"
        android:layout_height="@dimen/view_pager_height"
        android:scaleType="fitXY" />

    <FrameLayout
        android:id="@+id/youtube_fragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
          />

</LinearLayout>

//Some other view items
</RelativeLayout>

Мой Java-код ViewPagerAdapter:

public class ArticleViewPagerAdapter extends PagerAdapter {

    public String TAG = ArticleViewPagerAdapter.class.getSimpleName();
    private ArrayList<Article> mArticleList = new ArrayList<>();
    private Activity mContext;
    private LayoutInflater mLayoutInflater;
    private FragmentManager mFragmentManger;
    private YouTubePlayerListener mYouTubePlayerListener;



    public ArticleViewPagerAdapter(Activity context, ArrayList<Article> articleList, FragmentManager fragmentManager, YouTubePlayerListener youTubePlayerListener) {
        this.mContext = context;
        this.mArticleList = articleList;

        this.mFragmentManger = fragmentManager;
        this.mYouTubePlayerListener = youTubePlayerListener;
        mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return mArticleList.size();
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return view == (object);
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        View itemView = mLayoutInflater.inflate(R.layout.activity_news, container,
                false);
        itemView.setTag(position);
        updateView(itemView, position);
        ((ViewPager) container).addView(itemView);
        return itemView;
    }


    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

    private void updateView(View itemView, int position) {

        final int index = position;
        final View finalView = itemView;

        //Initializing the view items
        final ImageView mNewsImage = itemView.findViewById(R.id.some_image);
        final FrameLayout mYoutubeFragment = itemView.findViewById(R.id.youtube_fragment);
        //Let's Test using this
        final YouTubePlayerSupportFragment youTubePlayerFragment = YouTubePlayerSupportFragment.newInstance();

        ResArticle articleResponse = response.body();  //Got response from API
        if (articleResponse != null && articleResponse.getData() != null) {
            final Article article = articleResponse.getData();
            final String pageUrl = SHARE_BASE_URL + article.getArticleId();
            if (article != null) {


                if (article.getArticleType()==Constants.ARTICLE_TYPE_NEWS) {
                     //Basically setting visibility But you can ignore this part
                    mNewsImage.setVisibility(View.VISIBLE);
                    mYoutubeFragment.setVisibility(View.GONE);


                }

                if(article.getArticleType()==Constants.ARTICLE_TYPE_VIDEO) {
                    Log.d(TAG,"Article Type is Video");
                    mYoutubeFragment.setVisibility(View.VISIBLE);
                    mNewsImage.setVisibility(View.GONE);


                    youTubePlayerFragment.initialize(mContext.getString(R.string.web_client_id), new YouTubePlayer.OnInitializedListener() {
                        @Override
                        public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean wasRestored) {

                            youTubePlayer.setShowFullscreenButton(false);
                            youTubePlayer.cueVideo("video_id");
                            if (mYouTubePlayerListener!=null)
                                mYouTubePlayerListener.setYouTubePlayer(youTubePlayer);

                        }

                        @Override
                        public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
                            Log.e(TAG, "Youtube Video initialization failed");
                        }
                    });
                    FragmentTransaction transaction = mFragmentManger.beginTransaction();
                    transaction.replace(R.id.youtube_fragment, youTubePlayerFragment).commit();
                }

            }
        } else {
            Toast.makeText(mContext, mContext.getString(R.string.article_info_not_found), Toast.LENGTH_SHORT).show();
            Log.e(TAG, "Article info not found");
        }


        }

    }

}

И я вызываю адаптер из действия, а не YouTubeBaseActivity.

Проблема: воспроизведение видео на YouTube остановлено из-за несанкционированного наложения поверх проигрывателя. YouTubePlayerView не содержится внутри своего предка android.widget.FrameLayout Расстояния между краями предка и YouTubePlayerView: слева: 0, вверху: 0, справа: 0, внизу: 0 (все они должны быть положительными).

Почему я получаю сообщение об ошибке? Поскольку я загружаю несколько проигрывателей YouTube с помощью ViewPager. Как мы знаем, вьюпейджер загружает следующий, предыдущий и текущий элемент. Таким образом, текущее видео на YouTube инициализируется, как и следующее. Но поскольку текущий YouTubePlayer перекрывает следующий (который предварительно загружен).

Пожалуйста помоги. Или я должен использовать любую библиотеку для загрузки видео с YouTube.


person AkshayT    schedule 20.03.2018    source источник
comment
Вы можете настроить просмотр пейджера на загрузку одной страницы за раз   -  person M. Reza Nasirloo    schedule 25.03.2018
comment
Я пробовал это. Но возникает та же проблема + возникает огромное время загрузки страницы.   -  person AkshayT    schedule 26.03.2018
comment
Включите границы макета в опции разработчика и проверьте наличие отступов, полей или любого другого вида.   -  person Zayid Mohammed    schedule 27.03.2018
comment
Уже сделал это. Там ничего нет.   -  person AkshayT    schedule 27.03.2018
comment
Я знаю, что вы исследовали, но проверили ли вы stackoverflow.com/ вопросы/32086897/? первый результат говорит о той же ошибке   -  person Mohammad Tabbara    schedule 29.03.2018
comment
@AkshayTaru Ты нашел решение для этого?   -  person ymerdrengene    schedule 03.09.2018
comment
@ymerdrengene, отбросьте адаптер пейджера представления и используйте ViewStatePagerAdapter. И во фрагменте есть метод, который скажет вам, виден ли фрагмент или нет. Если он виден, то загружайте только YouTube.   -  person AkshayT    schedule 06.09.2018


Ответы (1)


исправить это, удалив отступы в YouTubePlayerView в макете. Таким образом, ваш макет выглядит следующим образом:

<com.google.android.youtube.player.YouTubePlayerView
    android:id="@+id/video_player"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#000" />

почему вы используете instantiateItem вместо getItem в адаптере?

person ygngy    schedule 28.03.2018
comment
Прокладки нет. Я также пробовал с getItem. До сих пор не работает - person AkshayT; 28.03.2018
comment
@AkshayTaru getItem не имеет отношения к вашей проблеме, но в адаптерах вы всегда должны создавать новые элементы в getItem, а реализация по умолчанию instantiateItem повторно использует ранее созданные элементы - person ygngy; 28.03.2018
comment
Да, спасибо, я не знал, что мы должны создавать новые элементы в getItem. Что я сделал, так это заменил адаптер viewpager на FragmentStatePager Adpater. И теперь код чист. Но все же пытаемся заставить его работать. - person AkshayT; 29.03.2018