2016-05-31 64 views
5

我與YouTubePlayerSupportFragment奮鬥了3天,試圖讓它在一個滑動片段中運行。它現在顯示這個錯誤,我嘗試了其他方法並得到NullPointerException。是否有可能將YouTubePlayerSupportFragment放在滑動片段中?YouTubePlayerSupportFragment在播放器頂部沒有視圖可以添加

java.lang.UnsupportedOperationException:沒有意見,可以在播放器 的頂部 在com.google.android.youtube.player.YouTubePlayerView.a(未知 來源) 被添加在com.google.android .youtube.player.YouTubePlayerView.addView在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1083)(未知 源) 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager .java:1252) 在 android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742) 在 android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617) 在 android.support.v4。 app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570) at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:164) at android.support.v4.view.ViewPager.populate(ViewPager.java :1177) at android.support.v4.view.ViewPager.populate(ViewPager.java:1025) at android.support.v4.view.ViewPage r.onMeasure(ViewPager.java:1545) 在android.view.View.measure(View.java) 在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java) 在 android.widget.LinearLayout.measureChildBeforeLayout(的LinearLayout的.java) 在android.widget.LinearLayout.measureVertical(LinearLayout.java) 在android.widget.LinearLayout.onMeasure(LinearLayout.java) 在 android.support.design.widget.AppBarLayout.onMeasure(AppBarLayout.java: 199) at android.view.View.measure(View.java) at android.view.ViewGroup.measureChildWithMar軋花(ViewGroup.java) 在 android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:668) 在 android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:735) 在android.view.View.measure(View.java) at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1075) at android.view.View.measure(View.java) at android .view.ViewGroup.measureChildWithMargins(ViewGroup.java) at android.widget.FrameLayout.onMeasure(FrameLayout.java) 在 android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135) 在android.view.View.measure(View.java) 在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java) 在 android.widget上的android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java) 。LinearLayout.measureVertical(LinearLayout.java) at android.widget.LinearLayout.onMeasure(LinearLayout.java) at android.view.View.measure(View.java) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java) 在android.widget.FrameLayout.onMeasure(FrameLayout.java) 在android.view.View.measure(View.java) 在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java) 在 android.widget.LinearLayout .measureChildBeforeLayout(LinearLayout.java) at android.widget.LinearLayout.measureVertical(LinearLayout.java) 在android.widget.FrameLayout上的android.view.ViewGroup.measureChildWithMargins(ViewGroup.java) 上的android.view.View.measure(View.java) 。 onMeasure(FrameLayout.java) at com.android.internal.policy.PhoneWindow $ DecorView.onMeasure(PhoneWindow.java) at android.view.View.measure(View.java) at android.view.ViewRootImpl.performMeasure (ViewRootImpl.java) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java) at android.view.ViewRootIm pl.performTraversals(ViewRootImpl.java) 在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java) 在android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java) 在android.view.Choreographer $ CallbackRecord.run( Choreographer.java) 在android.view.Choreographer.doCallbacks(Choreographer.java) 在android.view.Choreographer.doFrame(Choreographer.java) 在 android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java) 在android.os.Handler.handleCallback(Handler.java) at android.os.Handler.dispatchMessage(Handler。 JAVA) 在android.os.Looper.loop(Looper.java) 在android.app.ActivityThread.main(ActivityThread.java) 在java.lang.reflect.Method.invoke(本機方法)

MainActivity.java:

import android.os.Bundle; 
import android.support.design.widget.NavigationView; 
import android.support.design.widget.TabLayout; 
import android.support.v4.view.GravityCompat; 
import android.support.v4.view.ViewPager; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 

public class MainActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); 
     tabLayout.addTab(tabLayout.newTab().setText("Tab 1")); 
     tabLayout.addTab(tabLayout.newTab().setText("Tab 2")); 
     tabLayout.addTab(tabLayout.newTab().setText("Tab 3")); 
     tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 

     final ViewPager viewPager = (ViewPager) findViewById(R.id.pager); 
     final PagerAdapter adapter = new PagerAdapter 
       (getSupportFragmentManager(), tabLayout.getTabCount()); 
     viewPager.setAdapter(adapter); 
     viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
     tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 
      } 

      @Override 
      public void onTabUnselected(TabLayout.Tab tab) { 

      } 

      @Override 
      public void onTabReselected(TabLayout.Tab tab) { 

      } 
     }); 



     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
       this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
     drawer.setDrawerListener(toggle); 
     toggle.syncState(); 

     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
     navigationView.setNavigationItemSelectedListener(this); 
    } 

    @Override 
    public void onBackPressed() { 
     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     if (drawer.isDrawerOpen(GravityCompat.START)) { 
      drawer.closeDrawer(GravityCompat.START); 
     } else { 
      super.onBackPressed(); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    @SuppressWarnings("StatementWithEmptyBody") 
    @Override 
    public boolean onNavigationItemSelected(MenuItem item) { 
     // Handle navigation view item clicks here. 
     int id = item.getItemId(); 

     if (id == R.id.nav_camera) { 
      // Handle the camera action 
     } else if (id == R.id.nav_gallery) { 

     } else if (id == R.id.nav_slideshow) { 

     } else if (id == R.id.nav_manage) { 

     } else if (id == R.id.nav_share) { 

     } else if (id == R.id.nav_send) { 

     } 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     drawer.closeDrawer(GravityCompat.START); 
     return true; 
    } 
} 

PagerAdapter.java:

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentStatePagerAdapter; 

public class PagerAdapter extends FragmentStatePagerAdapter { 
    int mNumOfTabs; 

    public PagerAdapter(FragmentManager fm, int NumOfTabs) { 
     super(fm); 
     this.mNumOfTabs = NumOfTabs; 
    } 

    @Override 
    public Fragment getItem(int position) { 

     switch (position) { 
      case 0: 
       TabFragment1 tab1 = new TabFragment1(); 
       return tab1; 
      case 1: 
       TabFragment2 tab2 = new TabFragment2(); 
       return tab2; 
      case 2: 
       TabFragment3 tab3 = new TabFragment3(); 
       return tab3; 
      default: 
       return null; 
     } 
    } 

    @Override 
    public int getCount() { 
     return mNumOfTabs; 
    } 
} 

TabFragment1.java:

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
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.YouTubePlayerSupportFragment; 

public class TabFragment1 extends Fragment { 
    private String currentVideoID = "nCgQDjiotG0"; 
    public static final String API_KEY = "XXX"; 
    private YouTubePlayer YPlayer; 




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

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

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

     youTubePlayerFragment.initialize(API_KEY, new YouTubePlayer.OnInitializedListener() { 

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

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

      } 
     }); 

     return rootView; 
    } 

tab_fragment_1。XML:

<?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" 
    android:orientation="vertical"> 

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


</RelativeLayout> 

回答

4

嘗試

transaction.replace(R.id.youTubePlayer, youTubePlayerFragment).commit(); 

onCreateView或者乾脆直接檢索的片段(你必須在你的佈局)使用

YouTubePlayerSupportFragment youTubePlayerFragment = getFragmentManager().findFragmentById(R.id.youTubePlayer); 
+0

謝謝你!這是工作,但我遇到另一個錯誤的位置:http://stackoverflow.com/questions/37604918/exception-thrown逐調用構造函數,在-COM-谷歌,Android系統的YouTube-API-JAR-CL –

2

首先不是

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

使用的FrameLayout

<FrameLayout 
     android:id="@+id/frame_fragment" 
     android:layout_width="match_parent" 
     android:layout_height="200dp"></FrameLayout> 

然後初始化之後用

FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
     transaction.replace(R.id.frame_fragment, youTubePlayerFragment); 
     transaction.commit(); 
相關問題