web-dev-qa-db-fra.com

v4 getFragmentManager avec activité - Types incompatibles

J'ai une activité simple qui se déroule comme prévu.

import Android.app.Activity;
import Android.app.FragmentManager;
// import Android.support.v4.app.FragmentManager;
import Android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // FragmentManager fm = getSupportFragmentManager(); // ActionBarActivity
        FragmentManager fm = getFragmentManager(); // Activity
    }
}

J'ai ensuite remplacé 

import Android.app.FragmentManager;

avec

import Android.support.v4.app.FragmentManager;

afin que je puisse prendre en charge mes appareils plus anciens .. Cependant, cela signale une erreur:

Incompatible types.

    Required: Android.support.v4.app.FragmentManager

    Found: Android.app.FragmentManager

Qu'est-ce que je fais mal ici?

La solution populaire que j'ai trouvée consiste à utiliser getSupportFragmentManager () à la place, mais cela ne fonctionne que pour ActionBarActivites [edit - voir les réponses] et FragmentActivities. 

impossible de convertir Android.app.FragmentManager en Android.support.v4.app.FragmentManager

L'autre solution pertinente suggère d'utiliser FragmentActivity à la place, mais cela semble avoir les mêmes problèmes hérités.

La méthode getFragmentManager () n'est pas définie pour le type MyActivity

import Android.support.v4.app.FragmentManager;
import Android.os.Bundle;
import Android.support.v4.app.FragmentActivity;

    public class MainActivity extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
        // FragmentManager fm = getSupportFragmentManager(); // ActionBarActivity
        FragmentManager fm = getFragmentManager();
    }
}

Je suis presque sûr que la solution à ce problème sera déjà sur SE, mais ce n'est pas facile (pour moi) à trouver. L'exemple minimal devrait également aider d'autres personnes à le comprendre.

  • Je suis assez nouveau sur Android.
20
David

Dans votre premier cas, si vous utilisez getSupportFragmentManager(), vous devez étendre FragmentActivity ou ActionBarActivity (étend FragmentActivity), car FragmentActivity est la classe de base des fragments basés sur le support.

Dans votre deuxième cas, vous devez utiliser getSupportFragmentManager() au lieu de getFragmentManager().

Les fragments ont été introduits en nid d'abeille. Pour prendre en charge les fragments situés en-dessous de nid d'abeilles, vous devez utiliser des fragments de la bibliothèque de support, auquel cas vous devez étendre FragmentActivity et utiliser getSupportFragmentManager().

48
Raghunandan
use getSupportFragmentManager() instead, but this only works for ActionBarActivites.

Faux, cela devrait fonctionner dans votre FragmentActivity, que FragmentActivity se trouve dans votre package de support. Lorsque vous supportez un ancien appareil, toutes vos importations depuis activity, fragment, fragment managers, etc. doivent avoir Android.support.v4. pour spécifier que vous utilisez le package de support. sans utiliser ainsi résultera à incompatible compile time error.

What am I doing wrong here?

Vous combinez un package de support avec un package non support dont le résultat est incompatible compile time error, comme je l’ai dit ci-dessus.

4
Rod_Algonquin

pour Kotlin guyz vous n'avez pas à changer pour ne pas v4 

utiliser ci-dessous pour obtenir l'activité aussi longtemps que son parent 

(activity as MainDrawerActivity)

ou

((YourActivityName)getActivity());
1
Goodlife

Pour utilisation dans Java Dialog:

 - import Android.app.FragmentManager;
 - FragmentManager fragmentManager;

Pour Kotlin:

 - (activity as? YourActivity)?.fragmentManager
0
Maryam Azhdari