Android Studioをバージョン3.2に更新し、androidxを使用するための指示に従いました。
私はFragmentアクティビティ内でYoutubeフラグメントを使用しており、すべてが完璧に機能しましたが、更新後、これらの3つの単純な行で「メソッド 'add(...)'を解決できません」というエラーが表示されます。
YouTubePlayerSupportFragment youTubePlayerFragment = YouTubePlayerSupportFragment.newInstance();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.youtube_fragment, youTubePlayerFragment).commit();
...そして「追加」の代わりに「置換」を使用しようとすると、「第2引数のタイプが間違っています。見つかりました: 'com.google.Android.youtube.player.YouTubePlayerSupportFragment'、必須: 'androidx.fragment.app 。断片'"
...そのため、問題は新しいAndroidX機能に関係していると思います。
問題は、addメソッドがタイプの2番目のパラメーターを必要とすることです。
androidx.fragment.app.Fragment
...しかしYouTubePlayerSupportFragmentは以下を返します:
Android.support.v4.app.Fragment
誰もがこの問題を解決する方法を知っていますか? 「Android.support.v4.app.Fragment」を「androidx.fragment.app.Fragment」にキャストする方法はありますか?
transaction.replace
。エラーは無視してください。うまくいきます。 Googleはまだyoutube APIライブラリをandroidx
にリファクタリングしていません。
元のJavaファイル(com.google.Android.youtube.player.YouTubePlayerFragment
)をプロジェクトに同じパッケージにコピーしますが、異なるクラス名などをコピーします。com.google.Android.youtube.player.YouTubePlayerFragmentX
、およびAndroid.app.Fragment
からandroidx.fragment.app.Fragment
へ。
実装は同じです:
YouTubePlayerFragmentX youTubePlayerFragment = YouTubePlayerFragmentX.newInstance();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.youtube_fragment, youTubePlayerFragment).commit();
テスト済み...動作しています。
置換.add
transaction.add(R.id.youtube_fragment, youTubePlayerFragment).commit();
これで.replace
transaction.replace(R.id.youtube_fragment, youTubePlayerFragment).commit();
this クラスをプロジェクトフォルダにコピーします(以下のフォルダを作成する必要がある場合があります)
Java-> com-> google-> Android-> youtube-> player->(ここの名前)YouTubePlayerSupportFragmentX.Java
次にコードを置き換えます
YouTubePlayerSupportFragment
からYouTubePlayerSupportFragmentX
に。
@Hosszfulの回答に従って修正しました。このファイルを使用するだけで簡単にできます https://Gist.github.com/medyo/f226b967213c3b8ec6f6bebb5338a492
私はコードチャンクに従ってそれを動作させました。
Object obj =
getSupportFragmentManager().findFragmentById(R.id.youtube_player_fragment);
if (obj instanceof YouTubePlayerSupportFragment)
youTubePlayerFragment = (YouTubePlayerSupportFragment) obj;
デバッグ中に、fragmentmanagerがYouTubePlayerSupportFragmentのみのインスタンスになることがわかりました。しかし、コンパイラは私が書くときにそれをキャストすることができませんでした
(YouTubePlayerSupportFragment)
getSupportFragmentManager().findFragmentById(R.id.youtube_player_fragment);
上記のコードチャンク(instanceof)は正常に機能しました。