2017-07-03 9 views
-1

Ich weiß, das vor gefragt worden sein könnte, aber dies ist ein besonderer Fall, dass ich in ..Problemumgehung für Youtube API?

WICHTIG ich brauche, dies zu tun in einer separaten Klasse beteiligt bin, keine Tätigkeit. Eigentlich erweitert meine Klasse einen BaseViewPagerAdapter, geschrieben von jemand anderem ..

Die Idee ist, dass ich YoutubePlayerView nicht verwenden kann, weil ich YoutubeBaseActivity nicht erweitern kann.

Ich habe auch versucht YoutubePlayerSupportFragment verwenden, gleiche Arbeit nicht, weil ich nicht die refernce für die aus meiner XML-Datei ...

bekommen habe ich versuchen, so etwas wie dieses

public class YTVideoFragment extends YouTubePlayerSupportFragment { 
private final static String TAG = "YoutubeVideoFragment"; 
private static final String DEV_KEY = "key"; 
private static String id; 
private YouTubePlayer mPlayer; 
public static YTVideoFragment newInstance(String url){ 
    YTVideoFragment videoFragment = new YTVideoFragment(); 
    Bundle bundle = new Bundle(); 
    bundle.putString("uri", url); 
    videoFragment.setArguments(bundle); 
    videoFragment.init(0); 

    Log.i(TAG, "new Instance FINAL "); 
    return videoFragment; 

} 

public void init(final int time) { 
    initialize(DEV_KEY, new YouTubePlayer.OnInitializedListener() { 
     @Override 
     public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) { 
      mPlayer = youTubePlayer; 
      Log.i(TAG, "-=onInitializationSuccess=-"); 
      mPlayer.setPlayerStyle(YouTubePlayer.PlayerStyle.DEFAULT); 
      id = getArguments().getString("url"); 
      if (!b){ 
       mPlayer.loadVideo(id, time); 
      } 
     } 

     @Override 
     public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) { 
      Log.i(TAG, "-=onInitializationFailure=-"); 
      Log.e(TAG, youTubeInitializationResult.toString()); 
     } 
    }); 
} 

}

und ich habe eine Instanz dies in der Klasse, die BaseViewPageAdapter erstreckt und versuchte

YouTubePlayerSupportFragment youtube = YouTubePlayerSupportFragment.newInstance(); 
       youtube.getFragmentManager().beginTransaction().replace(R.id.youtubeplayerfragment,youtube); 
01 zu tun

Aber ich erhalte eine Fehlermeldung, die Funktion ersetzt auf einer Null-Objekt Referenz angewandt wird ..

Wenn Sie Vorschläge haben, oder eine Idee, wie ich könnte es auf diesem speziellen Fall funktioniert wäre ich dankbar

+0

Ich glaube, Sie 'youtube.getFragmentManager() begintransaction() ändern müssen, ersetzen (R.id.. .youtubeplayerfragment, youtube); 'zu' activity.getFragmentManager(). beginTransaction(). replace (R.id.youtubeplayerfragment, youtube); ' –

+0

@sunil Ich kann die Aktivität nicht bekommen ... weil ich nicht in einer bin Aktivitätsklasse –

+0

Dann müssen Sie Aktivität oder Kontextinstanz an diese Klasse übergeben. –

Antwort

0

ok, ich es geschafft, es auf meinem Kontext wie diesem

Zunächst einmal funktioniert, ich meine YTVideoFragment Klasse verändert sich Fragment

public class YoutubeFragment extends Fragment { 

private static final String API_KEY = DateUtils.getDeveloperKey(); 


private static String VIDEO_ID; 


public void setVideoID(String id){ 
    VIDEO_ID = id; 
} 


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


    YouTubePlayerSupportFragment youTubePlayerFragment = YouTubePlayerSupportFragment.newInstance(); 


    FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); 
    transaction.add(R.id.youtube_layout, youTubePlayerFragment).commit(); 


    youTubePlayerFragment.initialize(API_KEY, new OnInitializedListener() { 


     @Override 
     public void onInitializationSuccess(Provider provider, YouTubePlayer player, boolean wasRestored) { 
      if (!wasRestored) { 
       player.setPlayerStyle(YouTubePlayer.PlayerStyle.DEFAULT); 
       player.loadVideo(VIDEO_ID); 
       player.play(); 
      } 
     } 

     @Override 
     public void onInitializationFailure(Provider provider, YouTubeInitializationResult error) { 
      // YouTube error 
      String errorMessage = error.toString(); 
      Toast.makeText(getActivity(), errorMessage, Toast.LENGTH_LONG).show(); 
      Log.d("errorMessage:", errorMessage); 
     } 
    }); 

    return rootView; 
} 
} 

und machte eine Instanz dieser Klasse, wo ich neede d es wie dies

YoutubeFragment youtubeFragment = new YoutubeFragment(); 
       youtubeFragment.setVideoID(eventData.getYoutube_id()); 
       FragmentManager fragmentManager = ((FragmentActivity) context).getSupportFragmentManager(); 
       fragmentManager.beginTransaction().replace(R.id.relativeLayout, youtubeFragment) 
         .commit(); 

ich hier zu erwähnen, dass in einem BaseViewPagerAdapter sein musste ich meinen Kontext (FragmentActivity) gegossen, um die Lage sein, getSupportFragmentManager zu nennen();

Frame-Layout XML, die eine Videoview in meinem Haupt-XML-Datei ersetzen wird, ist dies:

<?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" > 
<FrameLayout 
    android:id="@+id/youtube_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_centerHorizontal="true" 
    android:visibility="visible" /> 
</RelativeLayout>