我想使用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()在错误处理,一些用户不会喜欢看到他们不了解的很多数字在他们的屏幕上,但也很好,因为他们可以快照并将其发送给您来调试错误.