FragmentPagerAdapter existiert nur in Android.Support.V4.App (und nicht in Android.App)

Lesezeit: 11 Minuten

Benutzer-Avatar
Samus

Ich kann FragmentPagerAdapter nicht in Android.App finden.

Ich möchte die Fragmente von Android.Support.V4.App nicht verwenden, da meine Ziel-API 14 und höher ist (Android 4.0 und höher). Also möchte ich einfach Android.App.Fragments und die zugehörigen Klassen verwenden.

Ich habe es nur in Android.Support.V4.App gefunden, aber das reicht mir nicht aus, weil ich versuche, Android.App.Fragments (nicht Android.Support.V4.App.Fragments) und dort zu verwenden verwandte Klassen innerhalb von Android.App (nicht Android.Support.V4.App), und mein Code wird nicht kompiliert, wenn ich meinen Pager von FragmentPagerAdapter ableite, wenn er aus der Support-Bibliothek stammt, da es zu einer Typabweichung zwischen Android.App und Android.Support kommt .V4.App.

Genau wie im Fall hier Kann nicht in android.app.Fragment umgewandelt werden, gibt es eine “normale” Pager (PagerAdapter)-Klasse, die ich anstelle von FragmentPagerAdapter oder etwas verwenden sollte (genau wie Sie von normaler Aktivität ableiten und nicht von FragmentActivity, beim Targeting von API 11 oder höher).

Hier ist der Beispielcode, mit dem ich arbeite (es ist die Datei FragmentPagerSupport.cs in der Lösung Support4.sln aus den MonoDroid-Beispielen unter https://github.com/xamarin/monodroid-samples/tree/master/Support4).

Ich habe die Zeilen, die auf Android.Support.V4.App verwiesen, auskommentiert und durch Code ersetzt, der auf Android.App verweist. Es gibt keinen FramePagerAdapter außerhalb von Android.Support.V4.App, den ich finden konnte, und ich brauche ihn wirklich).

Vielen Dank.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

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

namespace 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;

        protected override void OnCreate (Bundle bundle)
        {
            base.OnCreate (bundle);

            SetContentView(Resource.Layout.fragment_pager);

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

            pager = FindViewById<ViewPager>(Resource.Id.pager);
            pager.Adapter = adapter;

            var button = FindViewById<Button>(Resource.Id.goto_first);
            button.Click += (sender, e) => {
                pager.CurrentItem = 0;  
            };
            button = FindViewById<Button>(Resource.Id.goto_last);
            button.Click += (sender, e) => {
                pager.CurrentItem = NUM_ITEMS - 1;
            };
        }

                // ?????????????????????????????????????????????????
                // - where is FragmentPagerAdapter 
                // ?????????????????????????????????????????????????

        protected class MyAdapter : FragmentPagerAdapter 
        {
            public MyAdapter(FragmentManager fm) : base(fm)
            {
            }

            public override int Count {
                get {
                    return NUM_ITEMS;
                }
            }

            public override Fragment GetItem (int position)
            {
                return new ArrayListFragment(position);
            }


        }

        protected class ArrayListFragment : ListFragment
        {
            int num;

            public ArrayListFragment()
            {
            }

            public ArrayListFragment(int num)
            {
                var args = new 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)
            {
                var v = inflater.Inflate(Resource.Layout.fragment_pager_list, container, false);
                var tv = v.FindViewById<TextView>(Resource.Id.text);
                tv.Text = "Fragment #" + num;
                return v;
            }

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

                ListAdapter = new ArrayAdapter<string>(Activity, Android.Resource.Layout.SimpleListItem1, Cheeses.cheeseStrings);
            }

            public override void OnListItemClick(ListView l, View v, int position, long id) {
                Console.WriteLine ( "Item clicked: " + id);
            }
        }
    }
}

  • Da ist einer drin android.support.v13.app.FragmentPagerAdapter. Ich bin mir nicht sicher, ob dir das weiterhilft, aber…

    – PearsonArtPhoto

    21. November 2012 um 20:26 Uhr

  • PearsonArtPhoto Nicht sicher, da es keinen Android.Support.V13.View-Namespace gibt (in MonoDroid sowieso). Ich würde die Support-Bibliothek lieber überhaupt nicht verwenden, aber ich denke, dass dies noch nicht möglich ist.

    – samus

    23. November 2012 um 14:17 Uhr

  • Sieht so aus, als ob ViewPager auch nur in der Support-Bibliothek existiert …

    – samus

    23. November 2012 um 14:41 Uhr

  • developer.android.com/reference/android/support/v4/view/… Der Abschnitt „Klassenübersicht“ fasst diese missliche Lage ziemlich genau zusammen: „Beachten Sie, dass sich diese Klasse derzeit in einem frühen Entwurfs- und Entwicklungsstadium befindet neuere Version.”

    – samus

    23. November 2012 um 14:44 Uhr


  • Noch ein Auszug aus der Doku developer.android.com/tools/extras/support-library.html “Die Unterstützungsbibliothek für v4 bietet Zugriff auf mehrere Klassen, die mit Android 3.0 und höher eingeführt wurden, sowie einige aktualisierte Versionen bestehender Klassen und sogar einige APIs, die derzeit nicht auf der Android-Plattform vorhanden sind.” Warum sollten sie jedoch jemals einen so wichtigen Teil des Fragments “API” ausschließlich in der Support-Bibliothek belassen, wo der Rest davon außerhalb davon existiert. Vielleicht ein Versehen?

    – samus

    23. November 2012 um 15:09 Uhr

Benutzer-Avatar
PearsonArtPhoto

Da ist einer drin android.support.v13.app.FragmentPagerAdapter, was tun sollte, was Sie wollen. Es ist ein FragmentPagerAdapter für nicht unterstützte Fragmente.

Android Studio-Installation

Bitte fügen Sie folgende Gradle-Abhängigkeiten hinzu

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

  • Es gibt ein Durcheinander in dem Sinne, dass Sie keine verschachtelten Fragmente und getChildFragmentManager() in der Support-Bibliothek 13 verwenden können.

    – Yar

    13. August 2014 um 8:45 Uhr

  • Verwenden Sie die Kompilierung „com.android.support:support-v13:21.0.+“ für Gradle Build

    – CV2

    13. Februar 2015 um 22:40 Uhr


  • Mein Android Studio löst sich nicht auf import android.support.v13.app.FragmentPagerAdapter; irgendeine Idee? sicher, dass Sie ‘com.android.support:support-v13:23.1.1’ bereits zum Gradle hinzugefügt haben

    – Muhammad Naderi

    17. November 2015 um 14:38 Uhr


  • support:support-v13 Konflikt hat mit support:design in meinem Fall

    – Konstantin Konopko

    3. Juni 2016 um 13:17 Uhr

  • Aber jetzt ist es in api 27 veraltet -> die v4-Version wieder zu verwenden. Dann haben wir wieder das Problem, dass das lib-Fragment ohne Unterstützung nicht verwendet werden kann

    – Morten Holmgaard

    5. April 2018 um 8:32 Uhr

Benutzer-Avatar
Samus

Ugh, Sie müssen nur den FragmentPagerAdapter aus der V13-Unterstützungsbibliothek verwenden

Android.Support.V13.App.FragmentPagerAdapter

Dann können alle anderen Fragment-bezogenen Klassen aus den “normalen” Bibliotheken/Namespaces verwendet werden, mit Ausnahme von ViewPager, aber das ist keine große Sache.


Hier ist der Vollständigkeit halber ein Beispiel (modifiziertes “Support4”-Beispiel aus https://github.com/xamarin/monodroid-samples/):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

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

using Java.Lang;

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

namespace Support4
{
    [Activity (Label = "@string/fragment_pager_support")]
    [IntentFilter (new[]{Intent.ActionMain}, Categories = new[]{ "mono.support4demo.sample" })]
    public class FragmentPagerSupport : Activity
    //public class FragmentPagerSupport : FragmentActivity
    {
        const int NUM_ITEMS = 4;

        protected MyAdapter _pagerAdapter;
        protected ViewPager _viewPager;

        protected override void OnCreate (Bundle bundle)
        {
            base.OnCreate (bundle);

            SetContentView(Resource.Layout.fragment_pager);

            List<Fragment> fragments = new List<Fragment>();

            // *** MonoDroid 4.2.7 letter case bug *** make's first letter lower.

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

            fragments.Add(Fragment.Instantiate(this, typeName));
            fragments.Add(Fragment.Instantiate(this, typeName));
            fragments.Add(Fragment.Instantiate(this, typeName));
            fragments.Add(Fragment.Instantiate(this, typeName));

            //adapter = new MyAdapter(SupportFragmentManager);
            _pagerAdapter = new MyAdapter(FragmentManager, fragments);

            _viewPager = FindViewById<ViewPager>(Resource.Id.view_pager);
            _viewPager.Adapter = _pagerAdapter;
        }

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

        protected class MyAdapter : Android.Support.V13.App.FragmentPagerAdapter
        {
            private List<Fragment> _fragments;

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

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

            }

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

            public override int Count {
                get {
                    return NUM_ITEMS;
                }
            }

            //public override Android.Support.V4.App.Fragment GetItem(int p0)
            public override Fragment GetItem(int p0)
            {
                return _fragments[p0];
            }

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

                return (float)(0.5f);
            }
        }
    }

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

        private static int _colorIndex = 0;
        private static Android.Graphics.Color[] _colors = new[] { Android.Graphics.Color.Aqua, Android.Graphics.Color.DarkViolet,
        Android.Graphics.Color.Coral, Android.Graphics.Color.Bisque};

        public Fragment1()
        {
        }

        public Fragment1(int num)
        {
            var args = new 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(Resource.Layout.aaaaa, container, false);

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

            return v;
        }

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

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2010 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<!-- Top-level content view for the simple fragment sample. -->

<LinearLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="horizontal" android:padding="4dip"
  android:layout_width="match_parent" android:layout_height="match_parent">
  <!--android:gravity="center_horizontal"-->

  <android.support.v4.view.ViewPager
    android:id="@+id/view_pager"
    android:layout_width="700dip"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:background="#FFCCFFFF">

    <!--android:layout_width="match_parent"-->
  </android.support.v4.view.ViewPager>

</LinearLayout>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/screen_container"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

  <TextView android:id="@+id/text"
      android:layout_width="match_parent" android:layout_height="match_parent"
      android:gravity="center_vertical|center_horizontal"
      android:textAppearance="?android:attr/textAppearanceMedium"
      android:text="@string/hello_world"
      android:background="#FF335555"/>

</LinearLayout>

  • Es gibt ein Durcheinander in dem Sinne, dass Sie keine verschachtelten Fragmente und getChildFragmentManager() in der Support-Bibliothek 13 verwenden können.

    – Yar

    13. August 2014 um 8:45 Uhr

Fügen Sie diese Abhängigkeit zu den Gradle-Abhängigkeiten hinzu:

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

Und verwenden android.support.v13.app.FragmentPagerAdapter so (ich habe einfach das offizielle Demoprojekt in Android Studio geändert: Datei → Neu → Neues Projekt → Weiter → Weiter → Aktivität mit Registerkarten → Weiter → Fertig):

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

/** A simple FragmentPagerAdapter that returns a MapFragment and a 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;
        }
    }
}

Stand 2019 mit AndroidX

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

Hatte das gleiche Problem. Meine Lösung bestand darin, den Code von android.support.v4.app.FragmentPagerAdapter zu kopieren und dann die importierte Fragment-Klasse in android.app.Fragment zu ändern. Führen Sie anschließend weitere kleinere Anpassungen durch, um alle Fehler zu beseitigen. Zu meiner Überraschung funktioniert es einwandfrei. Meiner Meinung nach ist dies einfacher als das Hinzufügen einer Unterstützungsbibliothek, die Sie nicht wirklich benötigen.

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 for ViewPager that is compatible with android.app.Fragment.
 */
abstract class FragmentPagerAdapter extends PagerAdapter {

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

    /**
     * Returns a unique id for the fragment on the given position.
     * For example this can be the view id that is used on the page's fragment.
     * @param position The page index
     * @return An id that is unique with respect to the pages in the adapter.
     */
    abstract long getItemId(int position);

    /**
     * Returns the fragment for the given page index.
     * @param position The page index
     * @return The 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);

        // Do we already have this 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;
    }
}

1343700cookie-checkFragmentPagerAdapter existiert nur in Android.Support.V4.App (und nicht in Android.App)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy