Je viens de mettre à jour mon Android Studio vers la version 3.2 et j'ai suivi les instructions pour utiliser androidx.
J'ai utilisé un fragment Youtube dans une activité Fragment et tout a parfaitement fonctionné mais, après la mise à jour, ces 3 lignes simples me donnent maintenant l'erreur "Impossible de résoudre la méthode 'ajouter (...)'":
YouTubePlayerSupportFragment youTubePlayerFragment = YouTubePlayerSupportFragment.newInstance();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.youtube_fragment, youTubePlayerFragment).commit();
... et lorsque j'essaie d'utiliser "remplacer" au lieu de "ajouter", il est indiqué: "Type de deuxième argument incorrect. Trouvé: 'com.google.Android.youtube.player.YouTubePlayerSupportFragment', requis: 'androidx.fragment.app .Fragment'"
... ce qui me fait penser que le problème est lié à la nouvelle fonctionnalité AndroidX.
Le problème est que la méthode add veut le deuxième paramètre de type:
androidx.fragment.app.Fragment
... mais YouTubePlayerSupportFragment renvoie un:
Android.support.v4.app.Fragment
Est-ce que quelqu'un sait comment résoudre ce problème? Existe-t-il un moyen de caster le "Android.support.v4.app.Fragment" dans le "androidx.fragment.app.Fragment"?
Utilisez simplement transaction.replace
. Ignorez l'erreur, cela fonctionnera. Google n'a pas encore refactorisé la bibliothèque API YouTube pour androidx
.
Copiez simplement le fichier original Java (com.google.Android.youtube.player.YouTubePlayerFragment
) à votre projet dans le même package mais avec un nom de classe différent, etc. com.google.Android.youtube.player.YouTubePlayerFragmentX
, et mettez à jour la classe extend à partir de Android.app.Fragment
à androidx.fragment.app.Fragment
.
L'implémentation est la même:
YouTubePlayerFragmentX youTubePlayerFragment = YouTubePlayerFragmentX.newInstance();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.youtube_fragment, youTubePlayerFragment).commit();
Testé ... ça marche.
Remplacer .add
transaction.add(R.id.youtube_fragment, youTubePlayerFragment).commit();
avec ceci .replace
transaction.replace(R.id.youtube_fragment, youTubePlayerFragment).commit();
et copiez cette classe dans votre dossier de projet (il peut être nécessaire de créer les dossiers suivants)
Java -> com -> google -> Android -> youtube -> player -> (ici le nom de) YouTubePlayerSupportFragmentX.Java
puis dans le code remplacer
YouTubePlayerSupportFragment
à YouTubePlayerSupportFragmentX
.
Je l'ai corrigé en suivant la réponse @Hosszful, je l'ai rendu facile en utilisant simplement ce fichier, https://Gist.github.com/medyo/f226b967213c3b8ec6f6bebb5338a492
Je l'ai fait fonctionner en suivant le morceau de code.
Object obj =
getSupportFragmentManager().findFragmentById(R.id.youtube_player_fragment);
if (obj instanceof YouTubePlayerSupportFragment)
youTubePlayerFragment = (YouTubePlayerSupportFragment) obj;
Lors du débogage, j'ai découvert que le gestionnaire de fragments devenait une instance de YouTubePlayerSupportFragment uniquement. Mais le compilateur n'a pas pu le lancer quand j'écrirais
(YouTubePlayerSupportFragment)
getSupportFragmentManager().findFragmentById(R.id.youtube_player_fragment);
Le morceau de code ci-dessus (instanceof) a bien fonctionné.