私は使用していますYouTubeプレーヤーAPIそしてYouTube プレーヤー サポート フラグメントアプリで次のエラーが発生していますが、原因がわかりません。情報を探しましたが、役立つものは見つかりませんでした。
java.lang.IllegalStateException: YouTubeServiceEntity not initialized
at android.os.Parcel.readException(Parcel.java:1433)
at android.os.Parcel.readException(Parcel.java:1379)
at com.google.android.youtube.player.internal.l$a$a.a(Unknown Source)
at com.google.android.youtube.player.internal.o.a(Unknown Source)
at com.google.android.youtube.player.internal.ad.a(Unknown Source)
at com.google.android.youtube.player.YouTubePlayerView.a(Unknown Source)
at com.google.android.youtube.player.YouTubePlayerView$1.a(Unknown Source)
at com.google.android.youtube.player.internal.r.g(Unknown Source)
at com.google.android.youtube.player.internal.r$c.a(Unknown Source)
at com.google.android.youtube.player.internal.r$b.a(Unknown Source)
at com.google.android.youtube.player.internal.r$a.handleMessage(Unknown Source)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)
スタックトレースには、クラスやアクティビティを指す行番号がありません。
何か考えはありますか?
ありがとう!
編集
私のカスタムYoutubeプレーヤーフラグメントクラス:YouTubeVideoPlayerFragment.java
public class YouTubeVideoPlayerFragment extends YouTubePlayerSupportFragment {
private static final String ARG_URL = "url";
// ===========================================================
// Constructors
// ===========================================================
/**
* Mandatory empty constructor for the fragment manager to instantiate the
* fragment (e.g. upon screen orientation changes).
*/
public YouTubeVideoPlayerFragment() {
}
/**
* Factory method to generate a new instance of the fragment given a video URL.
*
* @param url The video url this fragment represents
* @return A new instance of this fragment with itemId extras
*/
public static YouTubeVideoPlayerFragment newInstance(String url) {
final YouTubeVideoPlayerFragment mFragment = new YouTubeVideoPlayerFragment();
// Set up extras
final Bundle args = new Bundle();
args.putString(ARG_URL, url);
mFragment.setArguments(args);
// Initialize YouTubePlayer
mFragment.init();
return mFragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
private void init(){
initialize(Constants.API_KEY, new YouTubePlayer.OnInitializedListener() {
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean wasRestored) {
if (!wasRestored) {
youTubePlayer.cueVideo(getArguments().getString(ARG_URL));
youTubePlayer.setShowFullscreenButton(false);
}
}
}
フラグメント.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
android:background="@color/black" >
<!-- For YoutubeFragment -->
<FrameLayout
android:id="@+id/youtube_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
呼び出し方法:
// Create a new instance of YouTubeVideoPlayerFragment providing video id
// and place it in the corresponding FrameLayout
final YouTubeVideoPlayerFragment youTubeVideoPlayerFragment = YouTubeVideoPlayerFragment.newInstance(VIDEO_ID);
final FragmentTransaction ft = getChildFragmentManager().beginTransaction();
ft.replace(R.id.youtube_fragment, youTubeVideoPlayerFragment);
ft.commit();
編集
そのエラーの原因が分かりました。シナリオは次のとおりです。
アクティビティが始まります。onCreate()
新しいインスタンスを作成しYouTubeVideoPlayerFragment
、初期化します。ユーチューブオブジェクト (YouTubeServiceEntity
内部的に を開始します) をそのメソッドで実行しますnewInstance()
。次に、ビデオの読み込み中に、以前にインスタンス化されたフラグメントが対応するオブジェクトにYouTube
アタッチされます。FragmentManager
FrameLayout
問題は次のとおりです:ビデオが読み込まれる前にユーザーがアクティビティを終了すると、例外がスローされます。
では、その場合にユーザーがアクティビティを終了したい場合は、何をどうすればいいのでしょうか? 何をすればいいのかよくわかりません!
ベストアンサー1
もう一度言いますが、ライフサイクルまたはコンテキストにバインドされたエンティティを操作するためにフラグメント コンストラクターまたはファクトリ メソッドを使用しないでください。簡単に言うと、このようなエンティティは、がsuper.onCreate(...)
呼び出された後にのみ使用できます。
ここで問題になるのは、init
メソッドをいつ呼び出すかということです。
これがYouTubePlayerFragment
ドキュメンテーション言う:
このフラグメントに関連付けられているは
YouTubePlayer
、その メソッドが呼び出されるたびに解放されますonDestroyView()
。したがって、initialize(String, YouTubePlayer.OnInitializedListener)
を設定することでフラグメント インスタンスがアクティビティの再作成後も保持される場合でも、このフラグメントに関連付けられているアクティビティが再作成されるたびに を再度呼び出す必要がありますsetRetainInstance(boolean)
。
init()
入れたくなるかもしれませんが、すでに呼び出され、レイアウトが実行されているonActivityCreated
ので、それは遅すぎます。onStart
対応するものはでonDestroyView
ありonViewCreated
、それが完璧な候補です。
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
init();
}
提案されているように、フラグメントのコンストラクターで呼び出しますsetRetainInstance(true)
。アクティビティが再作成されると、フラグメントは再作成されず、その UI のみがライフサイクル イベントを通過します。