FragmentPagerAdapter Yalnızca Android.Support.V4.App'ta (Android.App değil)


163

Android.App içinde FragmentPagerAdapter bulmak bulamıyorum.

Hedef API'm 14 ve üstü (Android 4.0 ve üstü) olduğu için Android.Support.V4.App'tan Fragment'ları kullanmak istemiyorum. Yani, sadece Android.App.Fragments ovasını kullanmak istiyorum ve ilgili sınıflar var.

Ben sadece Android.Support.V4.App içinde buldum, ama bu benim için yeterli değil b / c Android.App.Fragment's (Android.Support.V4.App.Fragment's) kullanmaya çalışıyorum ve orada Android.App (Android.Support.V4.App değil) ile ilgili sınıflar ve Android.App ve Android.Support arasında oluşan tür uyuşmazlığı nedeniyle, çağrı cihazımı Destek kütüphanesinden ise FragmentPagerAdapter'den türetirsem kodum derlenmeyecek. .V4.App.

Tıpkı burada olduğu gibi android.app.Fragment'a yayınlanamaz , FragmentPagerAdapter veya bir şey yerine kullanmanız gereken "normal" çağrı cihazı (PagerAdapter) sınıfı var (tıpkı normal Aktiviteden türettiğiniz gibi, FragmentActivity değil, API 11 veya üzerini hedeflerken).

İşte birlikte çalıştığım örnek kod ( https://github.com/xamarin/monodroid-samples/tree/master/Support4 adresinde bulunan MonoDroid örneklerinden Support4.sln çözümü içindeki FragmentPagerSupport.cs dosyası ).

Android.Support.V4.App'a başvuran satırları yorumladım ve bunları Android.App'a başvuran kodla değiştirdim. Android.Support.V4.App dışında bulabildiğim hiçbir FramePagerAdapter yok ve gerçekten ihtiyacım var).

Teşekkürler.

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

5
İçinde bir tane var android.support.v13.app.FragmentPagerAdapter. Bunun size yardımcı olup olmayacağından emin değilim, ama ...
PearsonArtPhoto

PearsonArtPhoto Android.Support.V13.View ad alanı olmadığından emin değilim (yine de MonoDroid'de). Destek kütüphanesini hiç kullanmamayı tercih ediyorum, ancak henüz mümkün olduğunu düşünmüyorum.
samis

Görünüşe göre ViewPager sadece destek kütüphanesinde var ...
samis

developer.android.com/reference/android/support/v4/view/… Sınıfa Genel Bakış bölümü bu durumu hemen hemen özetliyor - "Bu sınıfın şu anda erken tasarım ve geliştirme aşamasında olduğunu unutmayın. API, uyumluluk kitaplığı, yeni sürüme göre derlendiklerinde uygulamaların kaynak kodunda değişiklik yapılmasını gerektirir. "
samis

Dokümanlar developer.android.com/tools/extras/support-library.html adresinden başka bir alıntı "v4 için destek kitaplığı, Android 3.0 ve sonraki sürümlerle tanıtılan birkaç sınıfa, ayrıca mevcut sınıfların bazı güncellenmiş sürümlerine ve hatta bazı API'lara erişim sağlar şu anda Android platformunda mevcut değil ". Ancak, neden destek kütüphanesinde bu kadar önemli bir Parça Parçası "API" nı bıraktılar, eğer geriye kalanlar dışarıda varsa. Belki bir gözetim?
samis

Yanıtlar:


202

Olduğunu kimse yok android.support.v13.app.FragmentPagerAdapterbunu yapmak istediğinizi yapmalıyım. Desteklenmeyen parçalar için bir FragmentPagerAdapter.

Android Studio Kurulumu

Lütfen takip edin Bağımlı bağımlılıkları ekleyin

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

8
Destek lib 13'te iç içe parçaları ve getChildFragmentManager () kullanamayacağınız konusunda bir karışıklık var.
Yar

3
derleme oluşturmak için 'com.android.support:support-v13:21.0.+' derlemesini kullanın
cV2

benim android stüdyo import android.support.v13.app.FragmentPagerAdapter;herhangi bir fikri çözmez ? emin zaten derlemek için 'com.android.support:support-v13:23.1.1' derlemek ekledi
Muhammad Naderi

1
support:support-v13support:designbenim durumumda çatışma var
Konstantin Konopko

4
Ama şimdi v4 sürümünü tekrar kullanmak api 27 -> 'da kullanımdan kaldırıldı. Sonra hiçbiri destek lib kullanmak için bir yol değil, yine sorun var Fragment
Morten Holmgaard

16

Ugh, sadece V13 destek kütüphanesinden FragmentPagerAdapter kullanmanız gerekiyor

Android.Support.V13.App.FragmentPagerAdapter

Daha sonra, Parça ile ilgili diğer tüm sınıflar, ViewPager dışında "normal" kitaplıklardan / ad alanlarından kullanılabilir, ancak bu önemli değildir.


İşte tamlık için bir örnek ( https://github.com/xamarin/monodroid-samples/ adresinden değiştirilmiş "Support4" örneği ):

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>

2
Destek lib 13'te iç içe parçaları ve getChildFragmentManager () kullanamayacağınız konusunda bir karışıklık var.
Yar

2

Bu bağımlılığı sınıf bağımlılıklarına ekleyin:

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

Ve bu şekilde kullanın android.support.v13.app.FragmentPagerAdapter(sadece android stüdyosundaki resmi demo projesini değiştirdim: dosya → yeni → yeni proje → sonraki → sonraki → sekmeli etkinlik → sonraki → bitir):

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

AndroidX ile 2019'a göre

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

-1

Aynı sorun vardı. Benim çözüm kodu android.support.v4.app.FragmentPagerAdapter kopyalamak, sonra ithal Fragment sınıfını android.app.Fragment olarak değiştirmekti. Daha sonra tüm hataları kaldırmak için başka küçük uyarlamalar yapın. Şaşırtıcı şekilde mükemmel çalışıyor. IMO, gerçekten ihtiyacınız olmayan bir destek kitaplığı eklemekten daha kolaydır.

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;
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.