Question obj Fragment faux 2ème type d'argument trouvé 'Android.support.V4.app.Fragment.' obligatoire 'Android.app.Fragment'


Je ne peux pas comprendre pourquoi mon objFragment me pose des problèmes avec le responsable du support, je reçois cette erreur:

 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)

Et cela se produit sur objFragment sur cette ligne: .replace(R.id.container, objFragment)

Voici mon code complet:

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

}

25
2018-05-20 02:58


origine


Réponses:


le problème est qu'il y a une disparité dans les types de fragments entre objFragment et fragmentManager. Le premier vient du paquet android.support.v4.app tandis que le second vient du android.app paquet.

Voir cette réponse ici connaître la différence entre les deux types de fragments.

Maintenant pour réparer le problème que vous avez à gérer vos importations.

Soit utiliser import android.app.Fragment au lieu de import android.support.v4.app.Fragment

Ou faire comme Modge suggéré; Mettez à jour le contenu principal de votre application avec un gestionnaire de fragment de support comme celui-ci: FragmentManager fragmentManager = getSupportFragmentManager(). Mais vous devez également changer le type du FragmentManager lui-même. import android.app.FragmentManager à import android.support.v4.app.FragmentManager;


38
2017-09-07 18:53



Vous avez essayé d'utiliser le FragmentManager non compatible pour votre transaction. Changez-le pour obtenir le support.

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

22
2018-05-20 03:06



Juste changer getFragmentManager() à getSupportFragmentManager()


7
2018-04-28 21:34



Vous trouverez ci-dessous un exemple trouvé lors du balayage du réseau par quelqu'un, et cela a fonctionné pour moi, en espérant que cela vous aidera.

Menu_Fragment n'hérite pas de android.support.v4.app.Fragment. Vraisemblablement, il hérite de android.app.Fragment.

Il existe deux implémentations de fragments: la version native (par exemple, android.app.Fragment) et le backport (par exemple, android.support.v4.app.Fragment). Vous devez être cohérent. Votre activité est un FragmentActivity, qui fait partie du backport. Vous avez donc besoin que vos fragments héritent de android.support.v4.app.Fragment.


1
2018-01-08 20:32