web-dev-qa-db-fra.com

Impossible de convertir Android.support.v4.app.Fragment en Android.app.Fragment

Je fais ma première application Android et je voulais entrer directement dans l'API ICS. Jusqu'ici, j'ai créé une application utilisant un ActionBar, avec des onglets glissables utilisant Viewpager et Fragments.

Cependant, je rencontre des erreurs sur lesquelles je reviens sans cesse.

En fonction de la manière dont je l’implémente, il ne cesse de remonter à une erreur "Type mismatch": "ne peut pas convertir Android.support.v4.app.Fragment en Android.app.Fragment". J'ai essayé de supprimer toutes les références d'importation vers l'un ou l'autre, et cette erreur apparaît lorsque j'utilise uniquement Android.support.v4.app.Fragment dans TabListener, FragmentActivity et mes deux fragments.

L'erreur se produit dans mon TabListener:

import Android.app.ActionBar;
import Android.app.ActionBar.Tab;
import Android.app.Activity;
import Android.support.v4.app.Fragment;
import Android.support.v4.app.FragmentTransaction;
import Android.support.v4.view.ViewPager;
import Android.util.Log;

public class TabListener implements ActionBar.TabListener {
    private Android.app.Fragment fragment;
    private Activity activity;
    private ViewPager pager;
    private FragmentTransaction ft;

    public TabListener(Activity activity, Fragment fragment, ViewPager pager) {
        this.activity = activity;
        this.fragment = fragment;
        this.pager = pager;
    }

    @Override
    public void onTabSelected(Tab tab, Android.app.FragmentTransaction ft){     
        if (fragment == null) {
            ft.add(fragment, null);
        } else {
            ft.attach(fragment);
        }
    }

    @Override
    public void onTabReselected(Tab tab, Android.app.FragmentTransaction ft){
        // TODO Auto-generated method stub
    }

    @Override
    public void onTabUnselected(Tab tab, Android.app.FragmentTransaction ft){
        // TODO Auto-generated method stub  
    }
}

En supprimant "Android.app.FragmentTransaction ft", en ne le remplaçant que par "FragmentTransaction ft", le problème devient insatisfaisant. Alors de nouveaux problèmes se posent:

La méthode onTabReselected (ActionBar.Tab, FragmentTransaction) de type TabListener doit redéfinir ou implémenter une méthode de type supertype TabListener.Java.

La méthode onTabSelected (ActionBar.Tab, FragmentTransaction) de type TabListener doit substituer ou implémenter une méthode de type supertype TabListener.Java.

La méthode onTabUnselected (ActionBar.Tab, FragmentTransaction) de type TabListener doit remplacer ou implémenter une méthode de type supertype TabListener.Java.

Le type TabListener doit implémenter la méthode abstraite héritée ActionBar.TabListener.onTabReselected (ActionBar.Tab, FragmentTransaction) TabListener.Java

Le type TabListener doit implémenter la méthode abstraite héritée ActionBar.TabListener.onTabSelected (ActionBar.Tab, FragmentTransaction) TabListener.Java

Le type TabListener doit implémenter la méthode abstraite héritée ActionBar.TabListener.onTabUnselected (ActionBar.Tab, FragmentTransaction) TabListener.Java

Que se passe t-il ici?

Comme vous le comprendrez peut-être, je suis nouveau dans le développement Java et Android. J'ai l'impression d'être assez proche, mais je ne suis pas capable de résoudre ce problème. Je ne comprends pas pourquoi il veut "convertir d'Android.support.v4.app.Fragment à Android.app.Fragment alors que je ne suis même pas en train d'importer Android.app.Fragment.

Je suppose que cela est lié à l'utilisation du package de compatibilité. (Dois-je utiliser ce package pour créer une application pour la version la plus récente du SDK?)

43
SLekvak

Essayez d'utiliser getSupportFragmentManager() à la place de getFragmentManager()

123
gayavat

Que se passe t-il ici?

Alors que le package de support Android vous offre une implémentation Fragment à compatibilité avec les versions antérieures, la variable ActionBar fait pas une partie du package de support Android. Par conséquent, ActionBar.TabListener attend des objets Fragment natifs de l’API de niveau 11. Envisagez d'utiliser ActionBarSherlock pour disposer d'une barre d'action et de fragments de support Android.

mais alors il me reste un autre problème dans mon FragmentPagerAdapter

La FragmentPagerAdapter dans le package de support Android est un peu confuse. Elle veut des objets Fragment de niveau 11 de l'API, et non des objets Fragment d'Android Support. Cependant, vous pouvez cloner la source sur FragmentPagerAdapter (la source se trouve dans votre SDK) et créer votre propre implémentation utilisant la version support.v4 de Fragment et kin.

14
CommonsWare

Je sais qu'il est trop tard pour répondre à cette question, mais cela pourrait aider quelqu'un qui a le même problème. 

Allez dans votre dossier Java et cliquez sur l’activité de votre fragment.

Dans les importations, remplacez import Android.app.Fragment; par 

import Android.support.v4.app.Fragment;

Conservez le code dans MainActivity intact, ce qui devrait vous aider à résoudre le problème.

Remarque: Si cela ne fonctionne pas immédiatement, ne vous inquiétez pas. Construire> Reconstruire le projet .

4
4127157

Cette solution fonctionne pour moi

remplacer 

public class MyFragment extends Fragment{
}

avec

public class MyFragment extends Android.support.v4.app.Fragment{
}

et aussi remplacer l'importation

import Android.app.Fragment;

avec

import Android.support.v4.app.Fragment;
4
Tausif Ul Rahman

regardez ici: fragmentTransaction.add(R.id.main_container, new HomeFragment());vous ajoutez le fragment, mais suivez vous, vous utilisez la méthode replace(), vous devez donc remplacer au lieu de add()

0
X.Fain

J'ai eu le même problème hier.

Il existe une très belle page de Samsung qui couvre ActionBarSherlock . Vérifiez si vous utilisez une des imports/classes/méthodes à gauche et remplacez-les par les imports/classes/méthodes à droite.

0
Lesik2008

J'ai eu le même problème. Résolu en modifiant l'interface de implements ActionBar.TabListener à implements TabListener, puis implémentez les méthodes à l'intérieur de cette interface. Son aussi mentionné l'erreur que vous avez mentionnée.

0
RmK

Vous pouvez supprimer le package de support, ce qui devrait résoudre votre problème. Cela n'est nécessaire que lorsque vous avez besoin des fonctions d'Android 3.0 et supérieur dans les applications des versions antérieures.
Dans votre cas, vous obtenez à la fois les fragments par défaut d'ICS et les fragments du package de support. Si vous obtenez des objets provenant de différents packages, ils ne fonctionneront pas ensemble. 

Version courte; Vous utilisez soit un niveau d'api supérieur à Honecomb ou le package de support, pas les deux. 

0
Jave