web-dev-qa-db-fra.com

Le fragment de support du lecteur Youtube ne fonctionne plus sur Android studio 3.2 (androidx)

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"?

15
Nicola Salvaro

Utilisez simplement transaction.replace. Ignorez l'erreur, cela fonctionnera. Google n'a pas encore refactorisé la bibliothèque API YouTube pour androidx.

8
Bek

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.

3
Hosszuful

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

enter image description here

puis dans le code remplacer

YouTubePlayerSupportFragment à YouTubePlayerSupportFragmentX.

3
Attaullah

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

3
Mehdi

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é.

0
Mrityunjaya