在 viewpager 中显示 Youtube 视频

2023-11-21

我想设置YouTube内的视频ViewPager。为此我设置了FrameLayout在适配器中,我在其中设置了 YoutubeVideoFragment,如下所示:

我的 ViewPager 适配器:

import android.app.Activity;
import android.app.FragmentTransaction;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;

import np.com.test.R;
import np.com.test.fragment.YoutubeVideoFragment;

/**
 * Created by Vikash on 8/18/2015.
 */
public class TutorialVideoAdapter extends PagerAdapter {
private List<String> mList;
private Activity mActivity;

public TutorialVideoAdapter(Activity activity, List<String> list) {
    mActivity = activity;
    mList = list;
}

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

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

@Override
public Object instantiateItem(ViewGroup container, int position) {

    LayoutInflater inflater = (LayoutInflater) mActivity
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.pager_video_tutorial, container, false);

    YoutubeVideoFragment fragment = new YoutubeVideoFragment();
    Bundle bundle = new Bundle();
    bundle.putString("video_key", mList.get(position));
    fragment.setArguments(bundle);

    FragmentTransaction transaction = mActivity.getFragmentManager().beginTransaction();
    transaction.add(R.id.fragment_container, fragment);
    transaction.commit();

    container.addView(view);
    return view;
}

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

在上面的适配器中,其中YoutubeVideoFragment用于加载 Youtube 视频。

YouTube视频片段:

import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.google.android.youtube.player.YouTubeInitializationResult;
import com.google.android.youtube.player.YouTubePlayer;
import com.google.android.youtube.player.YouTubePlayerFragment;

import np.com.test.R;
import np.com.test.utils.Config;

/**
 * Created by Vikash on 8/18/2015.
 */
public class YoutubeVideoFragment extends Fragment implements YouTubePlayer.OnInitializedListener {

    private String YOUTUBE_VIDEO_CODE;
    private static final int RECOVERY_DIALOG_REQUEST = 1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        YOUTUBE_VIDEO_CODE = getArguments().getString("video_key");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View fragmentYoutubeView = inflater.inflate(R.layout.fragment_youtube_video, container, false);
        YouTubePlayerFragment mYoutubePlayerFragment = new YouTubePlayerFragment();
        mYoutubePlayerFragment.initialize(Config.GOOGLE_API_KEY, this);

        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.fragment_youtube_player, mYoutubePlayerFragment);
        fragmentTransaction.commit();

        return fragmentYoutubeView;
    }

    @Override
    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored) {
        if (!wasRestored) {
            player.cueVideo(YOUTUBE_VIDEO_CODE);
        }
    }

    @Override
    public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult errorReason) {
        if (errorReason.isUserRecoverableError()) {
            errorReason.getErrorDialog(getActivity(), RECOVERY_DIALOG_REQUEST).show();
        } else {
            String errorMessage = String.format(
                    getString(R.string.error_player), errorReason.toString());
            Toast.makeText(getActivity(), errorMessage, Toast.LENGTH_LONG).show();
        }
    }
}

XML布局两者的代码Fragmenet_youtube_videoandpager_video_tutorial:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_youtube_player"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

我得到了什么?仅显示第一个位置片段。我只能在 viewpager 中看到一个视频,其余页面都是空白。

我尝试了什么?我试图在谷歌中搜索昨天的解决方案,但没有成功。

我的问题:如何加载剩余YoutubeVideoFragment?

谢谢。


当页面包含多个 YouTubePlayerFragment 时,我收到错误消息:YouTube 视图与我的视图寻呼机重叠。

经过大量研究后,我解决如下。

  • 覆盖片段的 setUserVisibleHint()。

  • 释放之前的YouTubePlayer(mYoutubePlayer)。

  • 通过initialize() 创建一个新的播放器实例。

  • 在 onInitilizationSuccess 中,使用 youtube_video_id 加载播放器。

注意:我正在使用 FragmentStatePagerAdapter。

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    if (!isVisibleToUser && mYoutubePlayer != null) {
        mYoutubePlayer.release();
    }
    if (isVisibleToUser && mYouTubePlayerSupportFragment != null) {
        mYouTubePlayerSupportFragment.initialize(API_KEY, Context);
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 viewpager 中显示 Youtube 视频 的相关文章

随机推荐

  • jQuery 1.9.0 破坏 $.attrFn 对象

    我编写了一个有用的 移动 事件库 可以在这里找到 它本质上统一了触摸事件 以便单个事件可以绑定到一个元素 并且无论用户的设备 即移动设备或桌面设备 如何 它都会触发 代码一直运行良好 但是在调试用户的问题时 我注意到使用 jQuery 1
  • ShadowRoot.getSelection()?

    我有一个丰富的编辑器 我正在将其重写为 lit element 自定义元素 我使用 Firefox 最新 进行测试 我试图在自定义元素的 ShadowDom 中选择内容可编辑元素 在方法中 在 Firefox 调试器中 this shado
  • 如何使用 Python 将换行符写入 csv 中“\n”?

    我需要重新定义以下代码 以便行数据中的任何换行符 将显示为空行 显示为 n 书面文件中 然而 n 需要在每行之后写入以显示为空行 显然 每一行都需要编码为 utf 8 以避免错误 with open csvfile csv w as csv
  • C# 序列化和反序列化json到txt文件

    我在用着牛顿软件用于在我的 wpf 应用程序中处理 json 我有一个可以保存到txt 文件的客户 不涉及数据库 我这样做是这样的 public int store string reservation JObject customer n
  • 为什么我们使用数组而不是其他数据结构?

    在我编程时 我还没有看到数组比其他形式更适合存储信息的实例 我确实认为编程语言中添加的 功能 已经对此进行了改进 并由此取代了它们 我现在发现它们并没有被取代 而是被赋予了新的生命 可以这么说 那么 基本上 使用数组有什么意义呢 这并不是说
  • C++ 中宏相对于内联的优势

    我们知道内联是有利的 因为它们由编译器检查 并且与宏相比 作为参数传递时相同的操作 如 x 不会计算多次 但在一次采访中 有人问我在 C 中宏更适合内联的具体优点或情况 有谁知道答案或者可以思考这个问题 我唯一能想到的是 您可以使用宏来完成
  • 获取 iPhone 的物理屏幕尺寸(以英寸为单位)

    如何以编程方式获取以英寸为单位的屏幕尺寸 例如 iPhone 4 3 5 英寸 我找到了一种通过检测 iPhone iPad 型号来做到这一点的方法 但硬编码不是我想要的 所以我不看这样的东西 Swift 4 屏幕版本 let scale
  • mongodb c# API V2:ReplaceOne 和 FindOneAndReplace 之间的区别

    查看 mongodb 文档 我读到 FindOneAndReplace 将是一个原子操作 但我不明白的是为什么 ReplaceOne 不是原子的 如果存在差异 为什么还要使用 ReplaceOne 该文档揭示了一个不同的方法签名 替换一个
  • 读取文件直到Python中的特定字符

    我目前正在开发一个应用程序 该应用程序需要从文件中读取所有输入 直到遇到某个字符 通过使用代码 file open Questions txt r c file readlines c x strip for x in c 每次脱衣相遇 n
  • 从不同的基类重载同名的虚函数。是否可以? [复制]

    这个问题在这里已经有答案了 标题可能令人困惑 假设我们有以下设置 class A public virtual void fn 0 class B public virtual int fn class C public A public
  • R 创建包含每行最大值的列名的列

    我和这个问题有同样的要求 对于每一行返回最大值的列名 但是 我需要包含每行最大值的所有列的名称 如果我每行有两个相同的最大值 上面链接中提供的所有解决方案都会出现问题 df lt data frame V1 c 2 8 1 5 6 V2 c
  • 如何使用 c-ares 将 IP 解析为主机?

    这就是我到目前为止所做的 它可以编译 但当我尝试运行它时会出现段错误 include
  • 如何处理您想要扩展的密封在 .NET 库中的类?

    我正在阅读有关如何处理想要扩展 NET Framework 库中的密封类的问题的文章 这通常是一项常见且有用的任务 因此我开始思考 在这种情况下 有哪些解决方案 我相信在我读过的文章中演示了一种扩展密封类的 方法 但我现在不记得了 它不是扩
  • 如何获取通用 Windows 批处理文件时间戳

    我在 Windows 批处理文件中生成时间戳时遇到问题 因为我在不同的 Windows 版本上得到不同的日期格式 我的机器 gt echo date gt Tue 11 17 2009 友机 gt echo date gt 11 17 20
  • 如何使用 .bat 文件从 PATH 环境变量中删除特定标记?

    我正在编写卸载脚本 因此我想 撤消 安装对系统所做的修改 为了实现这个目标 我想解析PATH变量 并删除安装添加到的任何值PATH 为此 我开发了以下伪代码 保存内容PATH到临时变量 拆分PATH转换为令牌 使用 字符作为分隔符 并循环遍
  • 将表转换为分层字典?

    我有一个表格 A1 B1 C1 value A1 B1 C1 value A1 B1 C2 value A1 B2 C1 value A1 B2 C1 value A1 B2 C2 value A1 B2 C2 value A2 B1 C1
  • 瘦服务器:将 Rails 应用程序日志输出到控制台,如“rails s”那样

    我需要跑thin start or thin ssl start在我的 Rails 应用程序的根目录中 并查看输出到控制台的应用程序日志 类似于rails s does In config ru文件 位于应用程序的根目录 在该行之前添加以下
  • 授予 Node.js 访问证书/私钥的权限

    我正在尝试在我的 Node js 应用程序上使用 HTTPS 就像它已针对其他任何内容启用一样 我已经安装了密钥和证书 但我得到了Error EACCES permission denied当我试图在应用程序上指向它们时 密钥和证书都位于以
  • 是否可以保证 memset 将结构中的填充位清零?

    一般来说 根据 C 标准 是否可以保证带有 0 的 memset 会将 C 结构中的填充位清零 海湾合作委员会呢 例如 类似 struct MyStruct unsigned char member1 unsigned int member
  • 在 viewpager 中显示 Youtube 视频

    我想设置YouTube内的视频ViewPager 为此我设置了FrameLayout在适配器中 我在其中设置了 YoutubeVideoFragment 如下所示 我的 ViewPager 适配器 import android app Ac