2016-05-17 12 views
1

Wenn ich youtube playerview mit Scrollview verwende. ich erhalte folgende Fehlermeldung:Wie benutzt man youtube playerview mit scrollview?

05-17 16:39:16.899 28246-28246/com.example.mgic.projectmovie E/AndroidRuntime: FATAL EXCEPTION: main 
                        Process: com.example.mgic.projectmovie, PID: 28246 
                        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mgic.projectmovie/com.example.mgic.projectmovie.Video}: java.lang.NullPointerException 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2224) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2273) 
     at android.app.ActivityThread.access$800(ActivityThread.java:138) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1236) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:149) 
     at android.app.ActivityThread.main(ActivityThread.java:5045) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:610) 
     at dalvik.system.NativeStart.main(Native Method) 
     Caused by: java.lang.NullPointerException 
     at com.example.mgic.projectmovie.Video.onCreate(Video.java:64) 
     at android.app.Activity.performCreate(Activity.java:5231) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2188) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2273) 
     at android.app.ActivityThread.access$800(ActivityThread.java:138) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1236) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:149) 
     at android.app.ActivityThread.main(ActivityThread.java:5045) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:610) 
     at dalvik.system.NativeStart.main(Native Method) 

folgende ist mein Layout:

<ScrollView 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_centerHorizontal="true" 
      android:layout_marginTop="@dimen/_80sdp" 
      android:layout_marginBottom="@dimen/_55sdp" 
      android:layout_marginRight="@dimen/_30sdp" 
      android:layout_marginLeft="@dimen/_30sdp" 
      > 
      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical"> 
       <com.google.android.youtube.player.YouTubePlayerView 
        android:id="@+id/youtube_player" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" /> 

      </LinearLayout> 
     </ScrollView> 
+0

Was ist 'Logcat' angezeigt. Sende dein Logcat. –

+0

Der Fehler ist hier 'com.example.mgic.projectmovie.Video.onCreate (Video.java:64)'. Was ist in dieser Zeile? –

Antwort

2

Youtube Player-Ansicht spielt ein Video nicht an, wenn eine andere Layout darüber gezogen wird. Wenn Sie es also in einer Bildlaufansicht verwenden, ist sichergestellt, dass es nicht abgespielt wird und ein Overlay-Fehlerprotokoll ausgegeben wird. Der in diesem Szenario zu berücksichtigende Ansatz besteht darin, ein Miniaturbild des Videos in der Bildlaufansicht anzuzeigen. Wenn Sie auf das Miniaturbild klicken, navigieren Sie zu einem neuen eigenständigen Layout, das nur die Playeransicht enthält und das Video dort abspielt.

0

Ich konnte eine YouTubePlayerFragment innerhalb einer NestedScrollView arbeiten. die kurze antwort ist, dass ich ein root-level-layout (floating container) habe, welches die position eines ImageView (video thumbnail) innerhalb der NestedScrollView verfolgt. Wenn ich den Player laden möchte, fügt der Fragmentmanager ihn dem Layout auf Stammebene hinzu. Der Player wird weiterspielen, es sei denn, es wird außerhalb des Bildschirms gescrollt und ein Overlay erkannt.

einig Code:

... 
<android.support.v4.widget.NestedScrollView 
    android:id="@+id/topic_modules_scrollview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/white" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior"> 
    <LinearLayout 
     android:orientation="vertical" 
     android:id="@+id/topic_modules" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:padding="12dp"/> 
</android.support.v4.widget.NestedScrollView> 

<FrameLayout 
    android:id="@+id/topic_youtube_floating_fragment_container" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:paddingLeft="12dp" 
    android:paddingRight="12dp" 
    android:background="@android:color/transparent" 
    android:clickable="false" 
    android:focusable="false" /> 
... 

fügen Sie dann die Scroll-Änderung Logik

 final DetailYouTubeVideoFragment ytf = CustomYouTubeVideoFragment.newInstance(object, null); 

     mNestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() { 
      @Override 
      public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { 
       final View fragmentView = ytf.getView(); 
       if (fragmentView != null) { 
        final int sY = v.getScrollY(), 
          top = fragmentView.getTop() + v.getPaddingBottom(), 
          newTop = top - sY; 

        mYoutubeFloatingLayout.setTop(newTop); 
        mYoutubeFloatingLayout.setBottom(newTop + fragmentView.getHeight()); 
       } 
      } 
     }); 

     mYoutubeFloatingLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 
      @Override 
      public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
       // prevent repositioning when player state changes 
       if (top != oldTop) { 
        mYoutubeFloatingLayout.setTop(oldTop); 
        mYoutubeFloatingLayout.setBottom(oldBottom); 
       } 
      } 
     }); 

meine DetailYouTubeVideoFragment haben ein Feld zu einem YouTubePlayerFragment. In meinem Fragmente wird das Spieler-Fragment in den schwebenden Behälter eingeführt ...

getFragmentManager() 
      .beginTransaction() 
      .replace(R.id.topic_youtube_floating_fragment_container, mYouTubePlayerFragment) 
      .commit(); 

während dies für meinen App gearbeitet, ist es vielleicht nicht für jeden Fall zu arbeiten. Viel Glück!