我已经坚持了3天了,经过大量搜索后尝试了我遇到的一切,这篇文章真的是最后的手段,我试图用导航抽屉打开一个YouTubePlayerFragment
YouTubePlayerFragment无法转换为android.support.v4.app.Fragment是问题所在
编辑问题:我已经更新了代码,因为我使用了YouTubePlayerSupportFragment而不是YouTubePlayerFragment,我在主要活动中的displayView方法中遇到错误(案例4:fragment = new Youtube(); break;)说无法从Youtube转换为片段,我无法得到一个logcat,因为我甚至无法运行它
编辑问题2:代码再次更新,但现在我有运行时问题,继承logcat
- 07-22 22:15:09.782: E/AndroidRuntime(20603): FATAL EXCEPTION: main
- 07-22 22:15:09.782: E/AndroidRuntime(20603): Process: net.frankandwalters,PID: 20603
- 07-22 22:15:09.782: E/AndroidRuntime(20603): java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.youtube.player.YouTubePlayerView.a()' on a null object reference
- 07-22 22:15:09.782: E/AndroidRuntime(20603): at com.google.android.youtube.player.YouTubePlayerSupportFragment.onStart(Unknown Source)
- 07-22 22:15:09.782: E/AndroidRuntime(20603): at android.support.v4.app.Fragment.performStart(Fragment.java:1502)
- 07-22 22:15:09.782: E/AndroidRuntime(20603): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:957)
- 07-22 22:15:09.782: E/AndroidRuntime(20603): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
- 07-22 22:15:09.782: E/AndroidRuntime(20603): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
- 07-22 22:15:09.782: E/AndroidRuntime(20603): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460)
- 07-22 22:15:09.782: E/AndroidRuntime(20603): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
- 07-22 22:15:09.782: E/AndroidRuntime(20603): at android.os.Handler.handleCallback(Handler.java:739)
- 07-22 22:15:09.782: E/AndroidRuntime(20603): at android.os.Handler.dispatchMessage(Handler.java:95)
- 07-22 22:15:09.782: E/AndroidRuntime(20603): at android.os.Looper.loop(Looper.java:135)
- 07-22 22:15:09.782: E/AndroidRuntime(20603): at android.app.ActivityThread.main(ActivityThread.java:5351)
- 07-22 22:15:09.782: E/AndroidRuntime(20603): at java.lang.reflect.Method.invoke(Native Method)
- 07-22 22:15:09.782: E/AndroidRuntime(20603): at java.lang.reflect.Method.invoke(Method.java:372)
- 07-22 22:15:09.782: E/AndroidRuntime(20603): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
- 07-22 22:15:09.782: E/AndroidRuntime(20603): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
继承了java代码,希望有人能帮忙,谢谢
- import android.app.Activity;
- 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.YouTubePlayerSupportFragment;
- public class Youtube extends YouTubePlayerSupportFragment implements YouTubePlayer.OnInitializedListener {
- public static Youtube newInstance() {
- Youtube fragment = new Youtube();
- return fragment;
- }
- private void init(){
- initialize("AIzaSyBybXMSBPvhMKgM4RKqpneb4Tf4yObVAkY",this);
- }
- public Youtube() {
- }
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- }
- public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.youtubefragment,container,false);
- Youtube ytf = newInstance();
- ytf.init();
- getActivity().getSupportFragmentManager().beginTransaction()
- .add(R.id.youtube_player,ytf)
- .commit();
- return view;
- }
- @Override
- public void onAttach(Activity activity) {
- super.onAttach(activity);
- }
- @Override
- public void onDetach() {
- super.onDetach();
- }
- @Override
- public void onInitializationSuccess(YouTubePlayer.Provider provider,YouTubePlayer player,boolean wasRestored) {
- if (!wasRestored) {
- player.cueVideo("nCgQDjiotG0");
- }
- }
- @Override
- public void onInitializationFailure(YouTubePlayer.Provider provider,YouTubeInitializationResult youTubeInitializationResult) {
- Toast.makeText(getActivity(),"Failured to Initialize!",Toast.LENGTH_LONG).show();
- }
- }
这是xml代码
- <?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"
- android:orientation="vertical"
- android:background="@drawable/background"
- android:id="@+id/fragment_youtube_player_holder" >
- <fragment
- android:name="com.google.android.youtube.player.YouTubePlayerSupportFragment"
- android:id="@+id/youtube_player"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
- </LinearLayout>
这是包含导航抽屉的主要活动
- import java.util.ArrayList;
- import net.frankandwalters.adapter.NavDrawerListAdapter;
- import net.frankandwalters.model.NavDrawerItem;
- import android.support.v4.app.Fragment;
- import android.content.res.Configuration;
- import android.content.res.TypedArray;
- import android.os.Bundle;
- import android.support.v4.app.ActionBarDrawerToggle;
- import android.support.v4.app.FragmentActivity;
- import android.support.v4.widget.DrawerLayout;
- import android.util.Log;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.View;
- import android.widget.AdapterView;
- import android.widget.ListView;
- public class MainActivity extends FragmentActivity {
- private DrawerLayout mDrawerLayout;
- private ListView mDrawerList;
- private ActionBarDrawerToggle mDrawerToggle;
- // nav drawer title
- //private CharSequence mDrawerTitle;
- // used to store app title
- //private CharSequence mTitle;
- // slide menu items
- private String[] navMenuTitles;
- private TypedArray navMenuIcons;
- private ArrayList<NavDrawerItem> navDrawerItems;
- private NavDrawerListAdapter adapter;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- //mTitle = mDrawerTitle = getTitle();
- // load slide menu items
- navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
- // nav drawer icons from resources
- navMenuIcons = getResources()
- .obtainTypedArray(R.array.nav_drawer_icons);
- mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
- mDrawerList = (ListView) findViewById(R.id.list_slidermenu);
- navDrawerItems = new ArrayList<NavDrawerItem>();
- // adding nav drawer items to array
- // Home
- navDrawerItems.add(new NavDrawerItem(navMenuTitles[0],navMenuIcons.getResourceId(0,-1)));
- // Find People
- navDrawerItems.add(new NavDrawerItem(navMenuTitles[1],navMenuIcons.getResourceId(1,-1)));
- // Photos
- navDrawerItems.add(new NavDrawerItem(navMenuTitles[2],navMenuIcons.getResourceId(2,-1)));
- // Communities,Will add a counter here
- navDrawerItems.add(new NavDrawerItem(navMenuTitles[3],navMenuIcons.getResourceId(3,-1)));
- // Pages
- navDrawerItems.add(new NavDrawerItem(navMenuTitles[4],navMenuIcons.getResourceId(4,-1)));
- // What's hot,We will add a counter here
- navDrawerItems.add(new NavDrawerItem(navMenuTitles[5],navMenuIcons.getResourceId(5,-1)));
- navDrawerItems.add(new NavDrawerItem(navMenuTitles[6],navMenuIcons.getResourceId(6,-1)));
- navDrawerItems.add(new NavDrawerItem(navMenuTitles[7],navMenuIcons.getResourceId(7,-1)));
- navDrawerItems.add(new NavDrawerItem(navMenuTitles[8],navMenuIcons.getResourceId(8,-1)));
- navDrawerItems.add(new NavDrawerItem(navMenuTitles[9],navMenuIcons.getResourceId(9,-1)));
- navDrawerItems.add(new NavDrawerItem(navMenuTitles[10] + " Disc 3",navMenuIcons.getResourceId(10,-1)));
- // Recycle the typed array
- navMenuIcons.recycle();
- mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
- // setting the nav drawer list adapter
- adapter = new NavDrawerListAdapter(getApplicationContext(),navDrawerItems);
- mDrawerList.setAdapter(adapter);
- // enabling action bar app icon and behaving it as toggle button
- getActionBar().setDisplayHomeAsUpEnabled(true);
- getActionBar().setHomeButtonEnabled(true);
- mDrawerToggle = new ActionBarDrawerToggle(this,mDrawerLayout,R.drawable.ic_drawer,//nav menu toggle icon
- R.string.app_name,// nav drawer open - description for accessibility
- R.string.app_name // nav drawer close - description for accessibility
- ) {
- public void onDrawerClosed(View view) {
- //getActionBar().setTitle(mTitle);
- // calling onPrepareOptionsMenu() to show action bar icons
- invalidateOptionsMenu();
- }
- public void onDrawerOpened(View drawerView) {
- //getActionBar().setTitle(mDrawerTitle);
- // calling onPrepareOptionsMenu() to hide action bar icons
- invalidateOptionsMenu();
- }
- };
- mDrawerLayout.setDrawerListener(mDrawerToggle);
- if (savedInstanceState == null) {
- // on first time display view for first nav item
- displayView(0);
- }
- }
- /**
- * Slide menu item click listener
- * */
- private class SlideMenuClickListener implements
- ListView.OnItemClickListener {
- @Override
- public void onItemClick(AdapterView<?> parent,View view,int position,long id) {
- // display view for selected nav drawer item
- displayView(position);
- }
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.main,menu);
- return true;
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- // toggle nav drawer on selecting action bar app icon/title
- if (mDrawerToggle.onOptionsItemSelected(item)) {
- return true;
- }
- // Handle action bar actions click
- switch (item.getItemId()) {
- case R.id.action_settings:
- return true;
- default:
- return super.onOptionsItemSelected(item);
- }
- }
- /* *
- * Called when invalidateOptionsMenu() is triggered
- */
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- // if nav drawer is opened,hide the action items
- boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
- menu.findItem(R.id.action_settings).setVisible(drawerOpen && !drawerOpen);
- return super.onPrepareOptionsMenu(menu);
- }
- /**
- * Diplaying fragment view for selected nav drawer list item
- * */
- private void displayView(int position) {
- // update the main content by replacing fragments
- Fragment fragment = null;
- switch (position) {
- // case 0:
- // fragment = new Home();
- // break;
- // case 1:
- // fragment = new Forum();
- // break;
- // case 2:
- // fragment = new Facebook();
- // break;
- // case 3:
- // fragment = new Twitter();
- // break;
- case 4:
- //fragment = Youtube.newInstance();
- // if(YouTubeIntents.isYouTubeInstalled(getBaseContext()) ) {
- // if(YouTubeApiServiceUtil.isYouTubeApiServiceAvailable(getBaseContext()) != YouTubeInitializationResult.SUCCESS) {
- // // fragment = new Youtube();
- // Intent intent = YouTubeIntents.createUserIntent(this,"FrankandWalters");
- // startActivity(intent);
- //
- // } else {
- fragment = new Youtube();
- //Intent intent = YouTubeIntents.createUserIntent(this,"FrankandWalters");
- // startActivity(intent);
- // }
- // }
- break;
- // case 5:
- // fragment = new Instagram();
- // break;
- // case 6:
- // fragment = new Google();
- // break;
- // case 7:
- // fragment = new Gigography();
- // break;
- // case 8:
- // fragment = new Discography();
- // break;
- // case 9:
- // fragment = new Lyrics();
- // break;
- // case 10:
- // fragment = new Souvenirs();
- // break;
- default:
- break;
- }
- if (fragment != null) {
- getSupportFragmentManager().beginTransaction()
- .replace(R.id.frame_container,fragment).commit();
- // update selected item and title,then close the drawer
- mDrawerList.setItemChecked(position,true);
- mDrawerList.setSelection(position);
- //setTitle(navMenuTitles[position]);
- mDrawerLayout.closeDrawer(mDrawerList);
- } else {
- // error in creating fragment
- Log.e("MainActivity","Error in creating fragment");
- }
- }
- // @Override
- // public void setTitle(CharSequence title) {
- // mTitle = title;
- // getActionBar().setTitle("The Frank And Walters");
- // }
- /**
- * When using the ActionBarDrawerToggle,you must call it during
- * onPostCreate() and onConfigurationChanged()...
- */
- @Override
- protected void onPostCreate(Bundle savedInstanceState) {
- super.onPostCreate(savedInstanceState);
- // Sync the toggle state after onRestoreInstanceState has occurred.
- mDrawerToggle.syncState();
- }
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- // Pass any configuration change to the drawer toggls
- mDrawerToggle.onConfigurationChanged(newConfig);
- }
- }
解决方法
将YouTubePlayerFragment替换为
YouTubePlayerSupportFragment,因为这是使用Fragment支持版本的版本.