FragmentPagerAdapter Exists Only In Android.Support.V4.App (and not Android.App)

后端 未结 5 866
灰色年华
灰色年华 2020-12-12 14:54

I cannot find find FragmentPagerAdapter within Android.App.

I do not want to use the Fragment\'s from Android.Support.V4.App, as my target API is 14 and higher (Andr

相关标签:
5条回答
  • 2020-12-12 15:14

    As per 2019 with AndroidX

    implementation 'androidx.legacy:legacy-support-v13:1.0.0'
    implementation 'androidx.viewpager:viewpager:1.0.0'
    
    0 讨论(0)
  • 2020-12-12 15:21

    Add this dependecy to the gradle dependencies:

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

    And use android.support.v13.app.FragmentPagerAdapter like this (I simply modified the official demo project in android studio: file → new → new project → next → next → tabbed activity → next → finish):

    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;
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-12 15:25

    Had the same issue. My solution was to copy the code from android.support.v4.app.FragmentPagerAdapter, then change the imported Fragment class to android.app.Fragment. Afterwards do other minor adaptions to remove all errors. To my surprise it works perfectly. IMO this is simpler than adding a support library that you do not really need.

    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;
        }
    }
    
    0 讨论(0)
  • 2020-12-12 15:26

    There is one that is in android.support.v13.app.FragmentPagerAdapter, which should do what you want it to do. It's a FragmentPagerAdapter for non-support fragments.

    Android Studio Installation

    Please add follow Gradle dependencies

    dependencies {
        compile 'com.android.support:support-v13:+'
    }
    
    0 讨论(0)
  • 2020-12-12 15:26

    Ugh, you just need to use the FragmentPagerAdapter from the V13 support library

    Android.Support.V13.App.FragmentPagerAdapter
    

    Then all other Fragment related classes can be used from the "normal" libraries/namespaces, with the exception of ViewPager, but that's no big deal.


    Here's a sample for completeness (modified "Support4" example from 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>
    
    0 讨论(0)
提交回复
热议问题