【问题标题】:Integrating youtube to fragment将 youtube 集成到片段
【发布时间】:2014-12-15 00:54:55
【问题描述】:

我的 Activity 扩展了另一个 Activity 并由导航抽屉组成,其中每个项目打开一个新片段。我想将 Youtube 集成到其中一个片段中。以前我使用 YouTubePlayerView 将 Youtube 集成到 Activity 但这里在片段中是必需的。我在网上搜索,发现 YouTubePlayerFragment 将 youtube 集成到片段。但是当我在教程中搜索时,我发现即使使用 YouTubePlayerFragment 我们也在扩展 YouTubeBaseActivity 。这些是示例.. http://android-coding.blogspot.in/2013/04/example-to-use-youtubeplayerfragment-of.html http://android-er.blogspot.in/2013/06/example-to-use-youtubeplayerfragment-of.html

我无法理解如何使用 YouTubePlayerFragment 以使我的类扩展 Fragment 而不是我的项目中所需的 YouTubeBaseActivity..正如您在下面看到的那样,我的类扩展了另一个活动并包含导航抽屉,其中第五个选项打开 YouTube Fragment .我想在这个片段中播放 Youtube 视频..我正在简要布局我的课程如何-

public class LandingActivity extends BaseGActivity {
.
.
.
.


public void selectDrawerItem(int position) {

        Bundle args = new Bundle();

        switch (position) {
            case 0:
                currentFragment = new HomeFragment_();
                args.putString(G.General.MEDIA_TYPE_KEY, G.General.MEDIA_TYPE_ALL);
                GApplication.getInstance().stopGPlayer();
                break;
            case 1:
                currentFragment = new HomeFragment_();
                args.putString(G.General.MEDIA_TYPE_KEY, G.General.MEDIA_TYPE_PHOTO);
                GApplication.getInstance().stopGPlayer();
                break;
//
            case 2:
                currentFragment = new HomeFragment_();
                args.putString(G.General.MEDIA_TYPE_KEY, G.General.MEDIA_TYPE_AUDIO);
                GApplication.getInstance().stopGPlayer();
                break;

            case 3:
                currentFragment = new HomeFragment_();
                args.putString(G.General.MEDIA_TYPE_KEY, G.General.MEDIA_TYPE_VIDEO);
                GApplication.getInstance().stopGPlayer();
                break;
            case 4:
                currentFragment = new HomeFragment_();
                args.putString(G.General.MEDIA_TYPE_KEY, G.General.MEDIA_TYPE_MEME);
                GApplication.getInstance().stopGPlayer();
                break;
            case 5:
                currentFragment = new YoutubeFragment();
            default:
                currentFragment = new HomeFragment_();
                args.putString(G.General.MEDIA_TYPE_KEY, G.General.MEDIA_TYPE_ALL);
                GApplication.getInstance().stopGPlayer();
                break;
        }

        currentFragment.setArguments(args);
        FragmentManager frgManager = getFragmentManager();
        frgManager.beginTransaction().replace(R.id.content_frame, currentFragment)
                .commit();

        mDrawerList.setItemChecked(position, true);
        setTitle(dataList.get(position).getItemName());
        mDrawerLayout.closeDrawers();
    }


    public class YoutubeFragment extends Fragment implements YouTubePlayer.OnInitializedListener{
        private FragmentActivity myContext;

        private YouTubePlayer YPlayer;
        private static final String YoutubeDeveloperKey = "xyz";
        private static final int RECOVERY_DIALOG_REQUEST = 1;
        @Override
        public void onAttach(Activity activity) {

            if (activity instanceof FragmentActivity) {
                myContext = (FragmentActivity) activity;
            }

            super.onAttach(activity);
        }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {

            View rootView = inflater.inflate(R.layout.activity_you_tube_api, container, false);

            YouTubePlayerView youTubeView = (YouTubePlayerView) rootView.findViewById(R.id.youtube_view);
            youTubeView.initialize(YoutubeDeveloperKey, (YouTubePlayer.OnInitializedListener) myContext);
            return rootView;
        }
        @Override
        public void onInitializationFailure(YouTubePlayer.Provider provider,
                                            YouTubeInitializationResult errorReason) {
            if (errorReason.isUserRecoverableError()) {
                errorReason.getErrorDialog(this, RECOVERY_DIALOG_REQUEST).show();
            } else {
                String errorMessage = String.format(
                        "There was an error initializing the YouTubePlayer",
                        errorReason.toString());
                Toast.makeText(this, errorMessage, Toast.LENGTH_LONG).show();
            }
        }

        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == RECOVERY_DIALOG_REQUEST)
            {

                getYouTubePlayerProvider().initialize(YoutubeDeveloperKey, this);
            }
        }



        @Override
        public void onInitializationSuccess(YouTubePlayer.Provider provider,
                                            YouTubePlayer player, boolean wasRestored) {
            if (!wasRestored) {
                YPlayer = player;
                YPlayer.setFullscreen(true);
                YPlayer.loadVideo("2zNSgSzhBfM");
                YPlayer.play();
            }
        }

    }

YouTubeFragment.java

public class YoutubeFragment extends Fragment implements
        YouTubePlayer.OnInitializedListener {
    private FragmentActivity myContext;

private YouTubePlayer YPlayer;
private static final String YoutubeDeveloperKey = "xyz";
private static final int RECOVERY_DIALOG_REQUEST = 1;

@Override
public void onAttach(Activity activity) {

    if (activity instanceof FragmentActivity) {
        myContext = (FragmentActivity) activity;
    }

    super.onAttach(activity);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.activity_you_tube_api, container, false);

    YouTubePlayerSupportFragment youTubePlayerFragment = YouTubePlayerSupportFragment.newInstance();

    youTubePlayerFragment.initialize("DEVELOPER_KEY", new YouTubePlayer.OnInitializedListener() {


    });
    FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
    transaction.add(R.id.youtube_fragment, youTubePlayerFragment).commit();
    return rootView;

}
    @Override
    public void onInitializationSuccess (YouTubePlayer.Provider provider, YouTubePlayer
    youTubePlayer,boolean b){
        if (!b) {
            YPlayer = youTubePlayer;
            YPlayer.setFullscreen(true);
            YPlayer.loadVideo("2zNSgSzhBfM");
            YPlayer.play();
        }
    }

    @Override
    public void onInitializationFailure (YouTubePlayer.Provider
    provider, YouTubeInitializationResult youTubeInitializationResult){

    }
}

布局

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment
        android:name="com.google.android.youtube.player.YouTubePlayerSupportFragment"
        android:id="@+id/youtube_fragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

错误-

Error:(64, 101) error: <anonymous com.pc.gi.ui.fragment.YoutubeFragment$1> is not abstract and does not override abstract method onInitializationFailure(Provider,YouTubeInitializationResult) in OnInitializedListener

【问题讨论】:

  • 我最近在我的应用中实现了一个 youtube 视频播放器。我的第一次尝试是使用 YoutubePlayerFragment,但它的 API 有点不实用,而且它没有提供非常“流畅”的用户体验......所以我在 WebView 中尝试了 Youtube iframe API (developers.google.com/youtube/iframe_api_reference)。 Android WebView 不支持所有的 HTML5 功能,所以你需要自己做一些事情......但是这个 (code.google.com/p/html5webview) 是一个很好的起点。最终结果是值得的。

标签: android android-fragments youtube fragment


【解决方案1】:

首先正常扩展您的活动

 class YourActivity extends Activity...

在布局文件中放入以下行

<fragment
  android:name="com.google.android.youtube.player.YouTubePlayerSupportFragment"
  android:id="@+id/youtube_fragment"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"/>

然后在您的 Activity 中,您可以在 Fragment 的 onCreareView 方法中使用以下行创建它的实例。

YouTubePlayerSupportFragment youTubePlayerFragment = (YouTubePlayerSupportFragment) getActivity().getSupportFragmentManager()
                    .findFragmentById(R.id.youtube_fragment);

或者您可以在您的 xml 中声明一个 FrameLayout,然后使用以下行启动 YouTubeSupportFragment

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

    <FrameLayout
        android:id="@+id/youtube_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"
        android:visibility="visible" />

</RelativeLayout>

onCreateView 中的代码

 YouTubePlayerSupportFragment youTubePlayerFragment = YouTubePlayerSupportFragment.newInstance();

    youTubePlayerFragment.initialize("DEVELOPER_KEY", new OnInitializedListener() {

        @Override
        public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored) {

            if (!wasRestored) {
                YPlayer = player;
                YPlayer.setFullscreen(true);
                YPlayer.loadVideo("2zNSgSzhBfM");
                YPlayer.play();
            }

        }

        @Override
        public void onInitializationFailure(Provider arg0, YouTubeInitializationResult arg1) {
            // TODO Auto-generated method stub

        }
    });
    FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
    transaction.add(R.id.youtube_fragment, youTubePlayerFragment).commit();

这里的关键是使用YouTubePlayerSupportFragment 而不是YouTubePlayerFragment

希望这会有所帮助。

这是你的片段

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.android.youtube.player.YouTubeInitializationResult;
import com.google.android.youtube.player.YouTubePlayer;
import com.google.android.youtube.player.YouTubePlayer.OnInitializedListener;
import com.google.android.youtube.player.YouTubePlayer.Provider;
import com.google.android.youtube.player.YouTubePlayerSupportFragment;
import com.ismart.omanapp.R;

public class YoutubeFragment extends Fragment {
    private FragmentActivity myContext;

    private YouTubePlayer YPlayer;
    private static final String YoutubeDeveloperKey = "xyz";
    private static final int RECOVERY_DIALOG_REQUEST = 1;

    @Override
    public void onAttach(Activity activity) {

        if (activity instanceof FragmentActivity) {
            myContext = (FragmentActivity) activity;
        }

        super.onAttach(activity);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.activity_you_tube_api, container, false);

        YouTubePlayerSupportFragment youTubePlayerFragment = YouTubePlayerSupportFragment.newInstance();
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        transaction.add(R.id.youtube_fragment, youTubePlayerFragment).commit();

        youTubePlayerFragment.initialize("DEVELOPER_KEY", new OnInitializedListener() {

            @Override
            public void onInitializationSuccess(Provider arg0, YouTubePlayer youTubePlayer, boolean b) {
                if (!b) {
                    YPlayer = youTubePlayer;
                    YPlayer.setFullscreen(true);
                    YPlayer.loadVideo("2zNSgSzhBfM");
                    YPlayer.play();
                }
            }

            @Override
            public void onInitializationFailure(Provider arg0, YouTubeInitializationResult arg1) {
                // TODO Auto-generated method stub

            }
        });

    }
}

【讨论】:

  • Hii ..我想在片段中播放 youtube 视频..我的活动由导航抽屉组成,当我点击第五个项目时,它会打开一个播放 youtube 视频的片段。如果我将此代码放在活动中,它会在单击导航抽屉中的第五个项目时播放 youtube 视频..还是只会开始在活动中播放 youtube 视频?我应该在扩展片段的类中放置什么代码..请再次阅读我的问题..谢谢你的时间..
  • 实际上你希望 YoutubeFragment 在你的片段中。您需要使用getChildFragmentManager() 而不是getSupportedFragmentManager();
  • 你应该使用我的第二种方法。即创建一个xml文件并在其中放置一个frameLayout并使用我上面在您的片段onCreateView中编写的代码。
  • 感谢您的帮助..+1 为您的回答..plzz 使用 YouTubeFragment.java 和 xml 文件的更新代码查看上面的更新问题..我还列出了我遇到的错误..让我知道我哪里出错了..
  • 我用它在一个正在工作的 DialogFragment 中显示我的 YouTubeFragment。
【解决方案2】:

要使用片段实现 youtube 播放器,请遵循以下 3 个步骤:-

  1. 在活动 XML 文件中添加这些:

     <fragment
             android:name="com.google.android.youtube.player.YouTubePlayerFragment"
             android:id="@+id/youtube_fragment"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"/>
    
  2. 在活动 java 文件中创建一个新的 OnInitialize 监听器

    YouTubePlayer.OnInitializedListener onInitializedListener = new 
    YouTubePlayer.OnInitializedListener() {
         @Override
         public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) {
    
             youTubePlayer.loadVideo("Your_video_id");
    
    
    
         }
    
         @Override
         public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
    
         }
     };
    
  3. 初始化监听器后获取片段引用并初始化播放器。

    YouTubePlayerFragment youTubePlayerFragment = (YouTubePlayerFragment) getFragmentManager().findFragmentById(R.id.youtube_fragment);
    youTubePlayerFragment.initialize("You_Developer_Api_Key", onInitializedListener);
    

要获取开发者 API 密钥,请关注 link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 2013-02-18
    • 2016-09-06
    相关资源
    最近更新 更多