David
David

Reputation: 1017

v4 getFragmentManager with Activity - Incompatible types

I have a simple activity which runs as expected.

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
    }
}

I then replaced

import android.app.FragmentManager;

with

import android.support.v4.app.FragmentManager;

so I could support my older devices.. However, this reports an error:

Incompatible types.

    Required: android.support.v4.app.FragmentManager

    Found: android.app.FragmentManager

What am I doing wrong here?

The popular solution I found is to use getSupportFragmentManager() instead, but this only works for ActionBarActivites [edit - see answers] and FragmentActivities.

cannot convert from android.app.FragmentManager to android.support.v4.app.FragmentManager

The other relevant solution points to using a FragmentActivity instead, but this appears to have the same legacy problems.

The method getFragmentManager() is undefined for the 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();
    }
}

I'm pretty sure the solution to this will be on SE already, but it isn't easy (for me) to find. The minimal example should help other people with understanding it, too.

Upvotes: 26

Views: 55986

Answers (4)

Maryam Azhdari
Maryam Azhdari

Reputation: 1319

For use in Java Dialog:

 - import android.app.FragmentManager;
 - FragmentManager fragmentManager;

For Kotlin :

 - (activity as? YourActivity)?.fragmentManager

Upvotes: 0

Goodlife
Goodlife

Reputation: 3922

for Kotlin guyz u dont have to change to not v4

use below to get the activity as long as its the parent

(activity as MainDrawerActivity)

or

((YourActivityName)getActivity());

Upvotes: 2

Rod_Algonquin
Rod_Algonquin

Reputation: 26198

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

Wrong, it should work in your FragmentActivity, that FragmentActivity is in your support package, when you are supporting older device then all your import from activity,fragment, fragment managers, etc. must have android.support.v4. to specify that you are using the support package. without using so will result to incompatible compile time error.

What am I doing wrong here?

You are combining support package with non support package which result to incompatible compile time error, as I said above.

Upvotes: 4

Raghunandan
Raghunandan

Reputation: 133560

In your first case if you use getSupportFragmentManager() you need to extend FragmentActivity or extend ActionBarActivity (extends FragmentActivity) as FragmentActivity is the base class for support based fragments.

In your second case you need to use getSupportFragmentManager() instead of getFragmentManager().

Fragments were introduced in honeycomb. To support fragments below honeycomb you need to use fragments from the support library in which case you need to extend FragmentActivity and use getSupportFragmentManager().

Upvotes: 55

Related Questions