27

I can't work out why my objFragment is giving me issues with the support manager, I'm getting this error:

 Error:(101, 17) error: no suitable method found for replace(int,android.support.v4.app.Fragment)
method FragmentTransaction.replace(int,android.app.Fragment,String) is not applicable
(actual and formal argument lists differ in length)
method FragmentTransaction.replace(int,android.app.Fragment) is not applicable
(actual argument android.support.v4.app.Fragment cannot be converted to android.app.Fragment by method invocation conversion)

And it's happening on this on objFragment on this line: .replace(R.id.container, objFragment)

Here's my full code:

import android.app.ActionBar;
import android.app.Activity;
import android.app.FragmentManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.widget.DrawerLayout;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.support.v4.app.Fragment;



/* public class MainActivity extends FragmentActivity {

   public static FragmentManager fragmentManager;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);

       // initialising the object of the FragmentManager. Here I'm passing getSupportFragmentManager(). You can pass getFragmentManager() if you are coding for Android 3.0 or above.
       fragmentManager = getSupportFragmentManager();
   }
} */


public class MainActivity2Activity extends FragmentActivity
        implements NavigationDrawerFragment.NavigationDrawerCallbacks {

    /**
     * Fragment managing the behaviors, interactions and presentation of the navigation drawer.
     */
    private NavigationDrawerFragment mNavigationDrawerFragment;

    /**
     * Used to store the last screen title. For use in {@link #restoreActionBar()}.
     */
    private CharSequence mTitle;

    public static android.support.v4.app.FragmentManager fragmentManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_activity2);




        // initialising the object of the FragmentManager. Here I'm passing getSupportFragmentManager(). You can pass getFragmentManager() if you are coding for Android 3.0 or above.
        fragmentManager = getSupportFragmentManager();


        mNavigationDrawerFragment = (NavigationDrawerFragment)
                getFragmentManager().findFragmentById(R.id.navigation_drawer);
        mTitle = getTitle();

        // Set up the drawer.
        mNavigationDrawerFragment.setUp(
                R.id.navigation_drawer,
                (DrawerLayout) findViewById(R.id.drawer_layout));

        // initialising the object of the FragmentManager. Here I'm passing getSupportFragmentManager(). You can pass getFragmentManager() if you are coding for Android 3.0 or above.
        fragmentManager = getSupportFragmentManager();


    }

    @Override
    public void onNavigationDrawerItemSelected(int position) {

        // This method controls the navigation drawer

        Fragment objFragment = null;

        switch (position) {
            case 0:
                objFragment = new menu_1_fragment();
                break;
            case 1:
                objFragment = new menu_2_fragment();
                break;
            case 2:
                objFragment = new menu_3_fragment();
                break;
            case 3:
                objFragment = new menu_4_fragment();
                break;
            case 4:
                objFragment = new menu_5_fragment();
                break;
        }

        // update the main content by replacing fragments
        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.container, objFragment)
                .commit();
    }

    public void onSectionAttached(int number) {
        switch (number) {
            case 1:
                mTitle = getString(R.string.title_section1);
                break;
            case 2:
                mTitle = getString(R.string.title_section2);
                break;
            case 3:
                mTitle = getString(R.string.title_section3);
                break;
            case 4:
                mTitle = getString(R.string.title_section4);
                break;
            case 5:
                mTitle = getString(R.string.title_section5);
                break;
        }
    }

    public void restoreActionBar() {
        ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
        actionBar.setDisplayShowTitleEnabled(true);
        // actionBar.setTitle(mTitle);
    }




    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        if (!mNavigationDrawerFragment.isDrawerOpen()) {
            // Only show items in the action bar relevant to this screen
            // if the drawer is not showing. Otherwise, let the drawer
            // decide what to show in the action bar.
            getMenuInflater().inflate(R.menu.main_activity2, menu);
            restoreActionBar();
            return true;
        }
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        // Link to settings in the main menu or create google maps options
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {
        /**
         * The fragment argument representing the section number for this
         * fragment.
         */
        private static final String ARG_SECTION_NUMBER = "section_number";

        /**
         * Returns a new instance of this fragment for the given section
         * number.
         */
        public static PlaceholderFragment newInstance(int sectionNumber) {
            PlaceholderFragment fragment = new PlaceholderFragment();
            Bundle args = new Bundle();
            args.putInt(ARG_SECTION_NUMBER, sectionNumber);
            fragment.setArguments(args);
            return fragment;
        }

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main_activity2, container, false);
            return rootView;
        }


        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            ((MainActivity2Activity) activity).onSectionAttached(
                    getArguments().getInt(ARG_SECTION_NUMBER));
        }
    }

}
Johnathon Starge
  • 363
  • 3
  • 7
  • 14

4 Answers4

43

The problem is that there is a mismatch in fragments types between objFragment and fragmentManager. The first is from package android.support.v4.app while the second is from the android.app package.

See this answer here to know the difference between the two types of Fragments.

Now to fix the issue you have to handle your imports.

Either use import android.app.Fragment instead of import android.support.v4.app.Fragment

Or do as Modge suggested; Update the main content of your app with a support Fragment manager like this: FragmentManager fragmentManager = getSupportFragmentManager(). But then you also have to change the type of the FragmentManager itself; import android.app.FragmentManager to import android.support.v4.app.FragmentManager;

Community
  • 1
  • 1
siriuseteor77
  • 1,004
  • 2
  • 12
  • 30
25

You tried to use the non support FragmentManager for your transaction. Change it to get the support one.

    // update the main content by replacing fragments
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.container, objFragment)
            .commit();
Eoin
  • 4,050
  • 2
  • 33
  • 43
17

Just change getFragmentManager() to getSupportFragmentManager()

2

Below is the answer to a similar question I found while searching the internet. This worked for me, so I hope it will help you.

Menu_Fragment is not inheriting from android.support.v4.app.Fragment. Presumably, it is inheriting from android.app.Fragment.

There are two fragment implementations: the native one (e.g., android.app.Fragment) and the backport (e.g., android.support.v4.app.Fragment). You need to be consistent. Your activity is a FragmentActivity, which is part of the backport, so you need your fragments to inherit from android.support.v4.app.Fragment.

Abandoned Cart
  • 4,512
  • 1
  • 34
  • 41
MeCurious
  • 21
  • 1
  • If you are going to blindly copy and paste someone else's answer, you should invest the effort to credit them for it and provide it with the same quality. You can click the `edit` button to copy the formatting and the `share` button to get the link. – Abandoned Cart Mar 09 '20 at 20:59