164 votes

FragmentPagerAdapter existe uniquement dans Android.Support.V4.App (et non Android.App)

Je ne peux pas trouver FragmentPagerAdapter dans Android.App.

Je ne veux pas utiliser les fragments de Android.Support.V4.App, car mon API cible est de 14 et plus (Android 4.0 et plus). Ainsi, je veux juste utiliser les fragments standard de Android.App et leurs classes associées.

Je l'ai seulement trouvé dans Android.Support.V4.App, mais cela ne me suffit pas car j'essaie d'utiliser les Fragments Android.App (et non les Fragments Android.Support.V4.App) ainsi que leurs classes associées dans Android.App (et non pas dans Android.Support.V4.App), et mon code ne se compilera pas si je dérive mon pager de FragmentPagerAdapter s'il provient de la bibliothèque de support, en raison d'une incompatibilité de type entre Android.App et Android.Support.V4.App.

Exactement comme dans ce cas ici Cannot be cast to android.app.Fragment, y a-t-il une classe "normale" de pager (PagerAdapter) que je devrais utiliser à la place de FragmentPagerAdapter ou quelque chose du genre (comme vous dérivez d'une Activity normale et non d'une FragmentActivity lorsque vous ciblez l'API 11 ou plus).

Voici le code d'exemple sur lequel je travaille (c'est le fichier FragmentPagerSupport.cs dans la solution Support4.sln des exemples MonoDroid trouvés sur https://github.com/xamarin/monodroid-samples/tree/master/Support4).

J'ai commenté les lignes qui référençaient Android.Support.V4.App et les ai remplacées par du code qui référence Android.App. Je n'ai trouvé aucun FramePagerAdapter en dehors de Android.Support.V4.App et j'en ai vraiment besoin.

Merci.

utilise System;
utilise System.Collections.Generic;
utilise System.Linq;
utilise System.Text;

utilise Android.App;
utilise Android.Content;
utilise Android.OS;
utilise Android.Runtime;
utilise Android.Views;
utilise Android.Widget;
//utilise Android.Support.V4.App;
//utilise Android.Support.V4.View;

espace de noms Support4
{
    [Activity (Label = "@string/fragment_pager_support")]
    [IntentFilter (new[]{Intent.ActionMain}, Categories = new[]{ "mono.support4demo.sample" })]
    //public class FragmentPagerSupport : FragmentActivity
        public class FragmentPagerSupport : Activity
    {
        const int NUM_ITEMS = 10;
        MyAdapter adapter;
        ViewPager pager;

        protégé remplacement de void OnCreate (Bundle bundle)
        {
            base.OnCreate (bundle);

            SetContentView(Resource.Layout.fragment_pager);

            //adapter = new MyAdapter(SupportFragmentManager);
                        adapter = new MyAdapter(FragmentManager);

            pager = FindViewById(Resource.Id.pager);
            pager.Adapter = adapter;

            var button = FindViewById(Resource.Id.goto_first);
            button.Click += (sender, e) => {
                pager.CurrentItem = 0;  
            };
            button = FindViewById

5 votes

Il y en a un qui est dans android.support.v13.app.FragmentPagerAdapter. Pas sûr si cela vous aidera, mais...

0 votes

PearsonArtPhoto Je ne suis pas sûr car il n'y a pas d'espace de noms Android.Support.V13.View (en MonoDroid en tout cas). Je préférerais ne pas utiliser du tout la bibliothèque de support, mais je ne pense pas que ce soit possible pour le moment.

0 votes

Il semble que ViewPager existe uniquement dans la bibliothèque de support également...

203voto

PearsonArtPhoto Points 14639

Il y en a un qui se trouve dans android.support.v13.app.FragmentPagerAdapter, qui devrait faire ce que vous voulez. C'est un FragmentPagerAdapter pour les fragments non-supportés.

Installation d'Android Studio

Veuillez ajouter les dépendances Gradle suivantes

dependencies {
    compile 'com.android.support:support-v13:+'
}

8 votes

Il y a un désordre dans le sens où vous ne pouvez pas utiliser de fragments imbriqués et getChildFragmentManager() dans la bibliothèque de support 13.

3 votes

Utilisez compile 'com.android.support:support-v13:21.0.+' pour la construction de gradle

0 votes

Mon Android Studio ne résout pas import android.support.v13.app.FragmentPagerAdapter; une idée ? Je suis sûr d'avoir déjà ajouté compile 'com.android.support:support-v13:23.1.1' à gradle

16voto

Samus Arin Points 1117

Arf, vous devez simplement utiliser FragmentPagerAdapter de la bibliothèque de support V13

Android.Support.V13.App.FragmentPagerAdapter

Ensuite, toutes les autres classes Fragment peuvent être utilisées à partir des bibliothèques / espaces de noms "normaux", à l'exception de ViewPager, mais ce n'est pas grave.


Voici un exemple pour complétude (exemple modifié "Support4" de https://github.com/xamarin/monodroid-samples/) :

en utilisant System;
utilisant System.Collections.Generic;
utilisant System.Linq;
utilisant System.Text;

utilisation Android.App;
utilisation Android.Content;
utilisation Android.OS;
utilisation Android.Runtime;
utilisation Android.Util;
utilisation Android.Views;
utilisation Android.Widget;

utilisation Java.Lang;

utilisation Android.Support.V4.View;
utilisation Fragment = Android.App.Fragment;

namespace Support4
{
    [Activité (Étiquette = "@string/fragment_pager_support")]
    [IntentFilter (nouveau[]{Intent.ActionMain}, Catégories = nouveau[]{ "mono.support4demo.sample" })]
    public class FragmentPagerSupport : Activité
    //public class FragmentPagerSupport : FragmentActivity
    {
        const int NUM_ITEMS = 4;

        protégé MonAdaptateur _pagerAdapter;
        protégé ViewPager _viewPager;

        protégé override void OnCreate (Bundle bundle)
        {
            base.OnCreate (bundle);

            SetContentView(Ressource.Mise en page.fragment_pager);

            Liste fragments = nouvelle Liste();

            // *** Bug de cas de lettre MonoDroid 4.2.7 *** fait la première lettre en minuscule.

            //string typeName = typeof(Fragment1).FullName;
            string typeName = "support4." + typeof(Fragment1).Nom;

            fragments.Ajouter(Fragment.Instantiate(cela, typeName));
            fragments.Ajouter(Fragment.Instantiate(cela, typeName));
            fragments.Ajouter(Fragment.Instantiate(cela, typeName));
            fragments.Ajouter(Fragment.Instantiate(cela, typeName));

            //adapteur = nouveau MonAdaptateur(SupportFragmentManager);
            _pagerAdapter = nouveau MonAdaptateur(FragmentManager, fragments);

            _viewPager = FindViewById(Ressource.Id.view_pager);
            _viewPager.Adapter = _pagerAdapter;
        }

        public override bool OnTouchEvent(MotionEvent e)
        {
            retour base.OnTouchEvent(e);
        }

        protégé classe MonAdaptateur : Android.Support.V13.App.FragmentPagerAdapter
        {
            privé Liste _fragments;

            public override Java.Lang.Object  InstantiateItem(View p0, int p1)
            {
                return base.InstantiateItem(p0, p1);
            }

            public MonAdaptateur(Android.App.FragmentManager fm)
                : base(fm)
            {

            }

            //public MyAdapter(Android.Support.V4.App.FragmentManager fm, List fragments)
            //    : base(fm)
            public MonAdaptateur(FragmentManager fm, Liste fragments)
                : base(fm)
            {
                _fragments = fragments;
            }

            public override int Compter {
                obtenir {
                    retourner NUM_ITEMS;
                }
            }

            //public MyAdapter(Android.Support.V4.App.FragmentManager fm, List fragments)
            public override Fragment GetItem(int p0)
            {
                retourner _fragments[p0];
            }

            public override float GetPageWidth(int p0)
            {
                //return base.GetPageWidth(p0);
                //base.GetPageWidth(p0);

                retourner (float)(0.5f);
            }
        }
    }

    //public class Fragment1 : Android.Support.V4.App.Fragment
    public class Fragment1 : Fragment
    {
        int num;

        privé statique int _colorIndex = 0;
        privé couleur statique Android.Graphics.Color[] _colors = nouvel[] { Android.Graphics.Color.Aqua, Android.Graphics.Color.DarkViolet,
        Android.Graphics.Color.Coral, Android.Graphics.Color.Bisque};

        public Fragment1()
        {
        }

        public Fragment1(int num)
        {
            var args = nouveau Bundle();
            args.PutInt("num", num);
            Arguments = args;
        }

        public override void OnCreate(Bundle p0)
        {
            base.OnCreate(p0);

            num = Arguments != null ? Arguments.GetInt("num") : 1;
        }

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            View v = inflater.Inflate(Ressource.Mise en page.aaaaa, conteneur, faux);

            TextView tv = v.FindViewById(Ressource.Id.text);
            tv.Text = "# " + _colorIndex;
            tv.SetBackgroundColor(_colors[_colorIndex++]);

            retour v;
        }

        public override void OnActivityCreated(Bundle p0)
        {
            base.OnActivityCreated(p0);
        }
    }
}


2 votes

Il y a un problème dans le sens où vous ne pouvez pas utiliser des fragments imbriqués et getChildFragmentManager() dans la bibliothèque de support 13.

2voto

madx Points 159

Ajoutez cette dépendance aux dépendances gradle :

compile 'com.android.support:support-v13:+'

Et utilisez android.support.v13.app.FragmentPagerAdapter de cette manière (j'ai simplement modifié le projet de démonstration officiel dans Android Studio : fichier → nouveau → nouveau projet → suivant → suivant → activité à onglets → suivant → terminer) :

import android.app.Fragment;
import android.app.FragmentManager;
import android.support.v13.app.FragmentPagerAdapter;
import com.google.android.gms.maps.MapFragment;

/** Un simple FragmentPagerAdapter qui retourne un MapFragment et un PreferenceFragment. */
public class MainActivityAdapter extends FragmentPagerAdapter {

    private MapFragment mapFragment;
    private PreferencesFragment preferencesFragment;

    public MainActivityAdapter(FragmentManager fm) {
        super(fm);
        mapFragment = MapFragment.newInstance();
        preferencesFragment = new PreferencesFragment();
    }

    @Override
    public int getCount() {
        return 2;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return mapFragment;
            case 1:
                return preferencesFragment;
            default:
                return null;
        }
    }
}

0voto

V. Kalyuzhnyu Points 1515

À partir de 2019 avec AndroidX

implementation 'androidx.legacy:legacy-support-v13:1.0.0'
implementation 'androidx.viewpager:viewpager:1.0.0'

-1voto

mihca Points 271

Avait le même problème. Ma solution a été de copier le code depuis android.support.v4.app.FragmentPagerAdapter, puis de changer la classe Fragment importée en android.app.Fragment. Ensuite, faire d'autres adaptations mineures pour supprimer toutes les erreurs. À ma surprise, ça fonctionne parfaitement. À mon avis, c'est plus simple que d'ajouter une bibliothèque de support dont vous n'avez pas vraiment besoin.

import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;

/**
 * PagerAdapter pour ViewPager compatible avec android.app.Fragment.
 */
abstract class FragmentPagerAdapter extends PagerAdapter {

    private final FragmentManager mFragmentManager;
    private FragmentTransaction mCurTransaction = null;
    private Fragment mCurrentPrimaryItem = null;

    /**
     * Renvoie un identifiant unique pour le fragment à la position donnée.
     * Par exemple, cela peut être l'identifiant de la vue utilisé sur le fragment de la page.
     * @param position L'index de la page
     * @return Un identifiant unique par rapport aux pages dans l'adaptateur.
     */
    abstract long getItemId(int position);

    /**
     * Renvoie le fragment pour l'index de page donné.
     * @param position L'index de la page
     * @return Le fragment
     */
    abstract Fragment getItem(int position);

    public FragmentPagerAdapter(FragmentManager fragmentManager) {
        super();
        mFragmentManager = fragmentManager;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        if (mCurTransaction == null) {
            mCurTransaction = mFragmentManager.beginTransaction();
        }

        final long itemId = getItemId(position);

        // Avons-nous déjà ce fragment?
        String name = makeFragmentName(container.getId(), itemId);
        Fragment fragment = mFragmentManager.findFragmentByTag(name);
        if (fragment != null) {
            mCurTransaction.attach(fragment);
        } else {
            fragment = getItem(position);
            mCurTransaction.add(container.getId(), fragment,
                    makeFragmentName(container.getId(), itemId));
        }
        if (fragment != mCurrentPrimaryItem) {
            fragment.setMenuVisibility(false);
        }

        return fragment;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        if (mCurTransaction == null) {
            mCurTransaction = mFragmentManager.beginTransaction();
        }
        mCurTransaction.detach((Fragment) object);
    }

    @SuppressWarnings("ReferenceEquality")
    @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        Fragment fragment = (Fragment)object;
        if (fragment != mCurrentPrimaryItem) {
            if (mCurrentPrimaryItem != null) {
                mCurrentPrimaryItem.setMenuVisibility(false);
            }
            if (fragment != null) {
                fragment.setMenuVisibility(true);
            }
            mCurrentPrimaryItem = fragment;
        }
    }

    @Override
    public void finishUpdate(ViewGroup container) {
        if (mCurTransaction != null) {
            mCurTransaction.commitAllowingStateLoss();
            mCurTransaction = null;
        }
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return ((Fragment)object).getView() == view;
    }

    @Override
    public Parcelable saveState() {
        return null;
    }

    @Override
    public void restoreState(Parcelable state, ClassLoader loader) {
    }

    private static String makeFragmentName(int viewId, long id) {
        return "android:switcher:" + viewId + ":" + id;
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X