我想使用API​​中的YouTubePlayerFragment加载一个片段中的YoutubePlayer

我的片段的.xml文件是:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <!-- VIDEO CONTENT -->



    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:paddingLeft="@dimen/layout_horizontal_margin"
        android:paddingRight="@dimen/layout_horizontal_margin"
        android:paddingTop="@dimen/layout_vertical_margin"
        android:paddingBottom="@dimen/layout_vertical_margin" >


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

        </LinearLayout>


    <!-- LYRIC CONTENT -->

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="2" >

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="@drawable/af_background"
            android:layout_centerInParent="true" />



        <!-- TEXT STRUCTURE -->

        <LinearLayout
            android:orientation="vertical"
            android:id="@+id/lyric_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_centerHorizontal="true" >



            <LinearLayout
                android:id="@+id/start_layout"
                android:orientation="vertical"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:layout_gravity="center_horizontal"
                android:layout_centerInParent="true">

                <TextView
                    android:id="@+id/text_view"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:layout_marginTop="@dimen/lyric_margin_top"

                    android:gravity="center"
                    android:text="@string/textTitle2"
                    android:textSize="@dimen/lyric_size"
                    android:textIsSelectable="false"/>

            </LinearLayout>

        </LinearLayout>


        <!-- FRONT BACKGROUND -->


        <ImageView
            android:id="@+id/high_part_image"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:src="@drawable/af_background_up_side"
            android:scaleType="fitStart"/>

        <ImageView
            android:id="@+id/low_part_image"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:src="@drawable/af_background_down_side"
            android:scaleType="fitEnd"/>

    </RelativeLayout>


</LinearLayout>

你可以看到,我已经添加了

现在加载这个.xml的片段是:

public class MyFragment extends Fragment{


    /**
     * The fragment argument representing the item ID that this fragment
     * represents.
     */
    public static final String ARG_ITEM_ID = "item_id";

    /**
     * The content this fragment is presenting.
     */
    private Items.ItemList  mItem;

    /**
     * Mandatory empty constructor for the fragment manager to instantiate the
     * fragment (e.g. upon screen orientation changes).
     */
    public MyFragment() {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (getArguments().containsKey(ARG_ITEM_ID)) {
            // Load the content specified by the fragment
            // arguments. In a real-world scenario,use a Loader
            // to load content from a content provider.
            mItem = Items.ITEM_MAP.get(getArguments().getString(ARG_ITEM_ID));
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
        View rootView = inflater.inflate(android.R.layout.titles_fragment,container,false);



        // Show the  content as text in a TextView.
        if (mItem != null) {
            ((TextView) rootView.findViewById(android.R.id.textTitle2)).setMovementMethod(new ScrollingMovementMethod());

        }
        return rootView;
    }
}

最后,我有一个ActivityFragment实现“YouTubePlayer.OnInitializedListener”,从中我得到该片段.

public class ItemDetailActivity extends FragmentActivity implements YouTubePlayer.OnInitializedListener{

    private TextView mTextView;
    private ImageView hImageView;
    private ImageView lImageView;

    public static final String API_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";

    public static final String VIDEO_ID = "BJVlU7d-4x0";

    private YouTubePlayer youTubePlayer;
    private YouTubePlayerFragment youTubePlayerFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_item_detail);

        if (savedInstanceState == null) {
            // Create the detail fragment and add it to the activity
            // using a fragment transaction.
            fragmentTransaction(getIntent().getStringExtra(ItemDetailFragment.ARG_ITEM_ID));


        }
    }

    @Override
    public boolean onoptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:

                NavUtils.navigateUpTo(this,new Intent(this,ItemListActivity.class));
                return true;
        }
        return super.onoptionsItemSelected(item);
    }


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


            Toast.makeText(this,"YouTubePlayer.onInitializationFailure(): " + result.toString(),Toast.LENGTH_LONG).show();

    }

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

        Toast.makeText(getApplicationContext(),"YouTubePlayer.onInitializationSuccess()",Toast.LENGTH_LONG).show();



        if (!wasRestored) {
            player.cueVideo(VIDEO_ID);
        }

    }

    private void fragmentTransaction(String id) {

        Bundle arguments = new Bundle();
        Fragment fragment;

        String content = Items.ITEM_MAP.get(id).content;


        if(content.equalsIgnoreCase("Title 1")) {
            // Fragment transaction
            arguments.putString(ItemDetailFragment.ARG_ITEM_ID,id);
            fragment = new ItemDetailFragment();
            fragment.setArguments(arguments);

            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.item_detail_container,fragment)
                    .commit();
        }


        if(content.equalsIgnoreCase("Title 2")) {
            // Fragment transaction
            arguments.putString(ItemDetailFragment.ARG_ITEM_ID,id);
            fragment = new MyFragment);
            fragment.setArguments(arguments);
            FragmentManager fm = getSupportFragmentManager();
            //youTubePlayerFragment = fragment.getChildFragmentManager().findFragmentById(R.id.youtubeplayer_fragment);
            //youTubePlayerFragment = (YouTubePlayerFragment)getFragmentManager().findFragmentById(R.id.youtubeplayer_fragment);

            //Fragment ytbfragment = fragment.getChildFragmentManager().findFragmentById(R.id.youtubeplayer_fragment);
            FragmentTransaction ft = fm.beginTransaction();
            ft.replace(R.id.item_detail_container,fragment);
            //ft.add(R.id.youtubeplayer_fragment,youTubePlayerFragment);

            ft.commit();

            //youTubePlayerFragment.initialize(API_KEY,this);
        }


        if(content.equalsIgnoreCase("Title 3")) {
            // Fragment transaction
            arguments.putString(ItemDetailFragment.ARG_ITEM_ID,id);
            fragment = new ItemDetailFragment();
            fragment.setArguments(arguments);
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.item_detail_container,fragment)
                    .commit();
        }
    }
}

在标题2中,我得到的片段和我想要使用不同的方法获取YouTube播放器的内部片段,但它不起作用.
总是崩溃加载.xml试图让玩家形成当我尝试获得de YoutubeFragment.

如果我只加载原始片段,应用程序可以很好地获取xml文件.

有什么问题?

解决方法

我已经在这个问题上工作了几天,我终于找到了一个解决方案.我会在这里发送代码好吗?
@Override
public View onCreateView(LayoutInflater inflater,Bundle savedInstanceState) {
    View fragmentYoutubeView = inflater.inflate(R.layout.fragment_youtube,false);
    mYoutubePlayerFragment = new YouTubePlayerSupportFragment();
    mYoutubePlayerFragment.initialize(youtubeKey,this); 
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.fragment_youtube_player,mYoutubePlayerFragment);
    fragmentTransaction.commit();

    mYoutubeVideoTitle = (TextView)fragmentYoutubeView.findViewById(R.id.fragment_youtube_title);
    mYoutubeVideoDescription = (TextView)fragmentYoutubeView.findViewById(R.id.fragment_youtube_description);

    mYoutubeVideoTitle.setText(getArguments().getString(Resources.KEY_VIDEO_TITLE));
    mYoutubeVideoDescription.setText(getArguments().getString(Resources.KEY_VIDEO_DESC));

    VideoFragment.setTextToShare(getArguments().getString(Resources.KEY_VIDEO_URL));

    return fragmentYoutubeView;
}

在这段代码中,我通过一个Intent的YouTube视频ID(url),标题和描述,并将它们放在textViews中.要播放youtubePlayerFragment,我使用一个frameLayout(fragment_youtube_player),就像这样:

<FrameLayout
    android:id="@+id/fragment_youtube_player"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"/>

我重量为1,因为包含Frame和textViews的LinearLayout的权重为3,强制视图占据我告诉他们的空间.

问题的工具包在这里:

mYoutubePlayerFragment = new YouTubePlayerSupportFragment();
    mYoutubePlayerFragment.initialize(youtubeKey,mYoutubePlayerFragment);
    fragmentTransaction.commit();

此代码以编程方式替换了一个youtubePlayerSupportFragment的FrameLayout.所有这一切都在一个Android片段中,它的工作原理.

编辑1:

我看到了Fragment如何管理Youtube的API的成功和失败.澄清我的片段标题看起来像这样:

public class FragmentYoutubePlayerGenerator extends Fragment
implements YouTubePlayer.OnInitializedListener{

而这两种实现方法相当简单:

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

@Override
public void onInitializationFailure(Provider provider,YouTubeInitializationResult result) {   
    if (result.isUserRecoverableError()) {
        result.getErrorDialog(this.getActivity(),1).show(); 
    } else {
        Toast.makeText(this.getActivity(),Toast.LENGTH_LONG).show(); 
    }
}

我离开开发人员的选择离开或不离开result.toString()在错误处理,一些用户不会喜欢看到他们不了解的很多数字在他们的屏幕上,但也很好,因为他们可以快照并将其发送给您来调试错误.

如何使用另一个片段中的YouTubePlayerFragment加载YouTubePlayer? (机器人)的更多相关文章

  1. html5 移动端视频video的android兼容(去除播放控件、全屏)

    这篇文章主要介绍了html5 移动端视频video的android兼容,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. xcode-server – Xcode服务器在哪里存储机器人?如何将机器人转移到另一台机器上?

    我使用Xcode和Xcode服务器创建了多个机器人.我想备份这些机器人并将其转移到另一台机器上.如何才能做到这一点?

  3. ios – Xcode服务:选择Git Branch

    我开始在小牛身上建立新的Xcode服务.我创建了一个新的机器人–但是我没有要求它应该构建的分支机构?我不仅要建立主人,而且要建立不同的分支.解决方法在当前版本中,当您在Xcode中创建机器人时,它将链接到当前活动的分支.您可以轻松地验证它从Web界面,当您浏览到机器人–>Bot设置.或者,您可以通过Web界面创建机器人,您可以在其中指定分支名称纯文本.

  4. 我们如何在iOS应用程序中集成Captcha?

    我在iOS应用程序中加入了Captcha,但没有找到任何相关的方法.即使我注册了reCAPTCHA,搜索了Captcha的插件是否适用于iOS?我没有发现任何iOS插件.在RND的某个地方,我知道“它不需要移动应用程序”,但客户端希望Captcha在他的应用程序,所以我想知道:>是否可以在iOS应用程序/移动应用程序中集成Captcha:>如果是的话那么那么将它相关的方法是什么呢?

  5. ios – 如何在Xcode中创建机器人?获取“创建机器人需要一个受源代码控制的项目”.

    ]单击取消或配置遥控器会打开我的文件夹的配置,我看到我的遥控器添加得很好.我还尝试使用不同的名称再次添加远程存储库.我该如何前进?解决方法似乎这个问题发生在没有名为“origin”的远程时,因为这就是Xcode正在寻找的东西.当我将我的遥控器重命名为原点时,Xcode停止了抱怨,让我通过XcodeUI添加机器人.

  6. Silver:用Swift编写iOS、Android和.NET应用

    Silver编译器可以为.NETCLR、Java/AndroidJVM和Cocoa运行时提供编译工作。

  7. Swift教程17-淡化MVC,使用MVVM框架开发轻巧便于维护的iOS/android app

    MVVM是微软提出一种移动开发框架,旨在针对传统的MVC框架,解决传统的MVC框架的控制器的臃肿问题.M:Model模型,也就是数据模型;比如一条微博,对应的所有字段合成一条微博整体,这个整体就是ModelV:View视图,只用来显示的视图,如iOS的UIView,Cell;当然在iOS中Storyboard中,view总是和控制器关联,这并不是严格的view如果我们纯手写代码定义一个view那么

  8. Swift 开发 Uther 小记 - 一个简单的蠢萌机器人

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  9. R.swift 让iOS项目像Android R 一样管理资源

    什么是R.Swift搞过的Android开发同学都知道,在Android开发中,其对于资源的引用非常方便,我们可以通过”R机制”来对Android中的图片、布局、动画配置、国际化字符串、尺寸等等资源进行非常方便快捷的引用。开妈搞iOS的时候,我瞬间觉得iOS的资源引用略为恶心,跟Android比起来,它更加蛋疼麻烦。R.Swift是一款基于Swift平台,针对iOS以及TVOS开发的仿Android资源引用框架。

  10. swift – 使用“如果让…”与许多表达式

    Swift1.2更新从Swift1.2开始,如果允许允许展开多个可选项,那么现在可以写下这个,如下例所示:您甚至可以交换条件,如:以前在Swift1.2之前有效没有一个丑陋的力量包装,你可以这样做:实际上仍然很冗长这是因为可选类型的表单类型?实际上是可选的的缩写,这是一个大致如下的枚举:然后,您可以使用模式匹配作为任何其他枚举。

随机推荐

  1. bluetooth-lowenergy – Altbeacon库无法在Android 5.0上运行

    昨天我在Nexus4上获得了Android5.0的更新,并且altbeacon库停止了检测信标.似乎在监视和测距时,didEnterRegion和didRangeBeaconsInRegion都没有被调用.即使RadiusNetworks的Locate应用程序现在表现不同,一旦检测到信标的值,它们就不再得到更新,并且通常看起来好像信标超出了范围.我注意到的一点是,现在在logcat中出现以下行“B

  2. android – react-native动态更改响应者

    我正在使用react-native进行Android开发.我有一个视图,如果用户长按,我想显示一个可以拖动的动画视图.我可以使用PanResponder实现这一点,它工作正常.但我想要做的是当用户长按时,用户应该能够继续相同的触摸/按下并拖动新显示的Animated.View.如果您熟悉Google云端硬盘应用,则它具有类似的功能.当用户长按列表中的任何项目时,它会显示可拖动的项目.用户可以直接拖

  3. android – 是否有可能通过使用与最初使用的证书不同的证书对其进行签名来发布更新的应用程序

    是否可以通过使用与最初使用的证书不同的证书进行签名来发布Android应用程序的更新?我知道当我们尝试将这样的构建上传到市场时,它通常会给出错误消息.但有没有任何出路,比如将其标记为主要版本,指定市场中的某个地方?解决方法不,你不能这样做.证书是一种工具,可确保您是首次上传应用程序的人.所以总是备份密钥库!

  4. 如何检测Android中是否存在麦克风?

    ..所以我想在让用户访问语音输入功能之前检测麦克风是否存在.如何检测设备上是否有麦克风.谢谢.解决方法AndroidAPI参考:hasSystemFeature

  5. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

  6. android – 获得一首歌的流派

    我如何阅读与歌曲相关的流派?我可以读这首歌,但是如何抓住这首歌的流派,它存放在哪里?解决方法检查此代码:

  7. android – 使用textShadow折叠工具栏

    我有一个折叠工具栏的问题,在展开状态我想在文本下面有一个模糊的阴影,我使用这段代码:用:我可以更改textColor,它可以工作,但阴影不起作用.我为阴影尝试了很多不同的值.是否可以为折叠文本投射阴影?

  8. android – 重用arm共享库

    我已经建立了armarm共享库.我有兴趣重用一个函数.我想调用该函数并获得返回值.有可能做这样的事吗?我没有任何头文件.我试过这个Android.mk,我把libtest.so放在/jni和/libs/armeabi,/lib/armeabi中.此时我的cpp文件编译,但现在是什么?我从objdump知道它的名字编辑:我试图用这个android.mk从hello-jni示例中添加prebuild库:它工作,但libtest.so相同的代码显示以下错误(启动时)libtest.so存在于libhello-j

  9. android – 为NumberPicker捕获键盘’Done’

    我有一个AlertDialog只有一些文本,一个NumberPicker,一个OK和一个取消.(我知道,这个对话框还没有做它应该保留暂停和恢复状态的事情.)我想在软键盘或其他IME上执行“完成”操作来关闭对话框,就像按下了“OK”一样,因为只有一个小部件可以编辑.看起来处理IME“Done”的最佳方法通常是在TextView上使用setonEditorActionListener.但我没有任何Te

  10. android – 想要在调用WebChromeClient#onCreateWindow时知道目标URL

    当我点击一个带有target=“_blank”属性的超链接时,会调用WebChromeClient#onCreateWindow,但我找不到新的窗口将打开的新方法?主页url是我唯一能知道的东西?我想根据目标网址更改应用行为.任何帮助表示赞赏,谢谢!

返回
顶部