android - FragmentPagerAdapter 仅存在于 Android.Support.V4.App(而不是 Android.App)中

标签 android android-fragments xamarin.android fragmentpageradapter

我在 Android.App 中找不到 FragmentPagerAdapter。

我不想使用 Android.Support.V4.App 中的 Fragment,因为我的目标 API 是 14 及更高版本(Android 4.0 及更高版本)。所以,我只想使用普通的 Android.App.Fragments, 以及相关的类。

我只在 Android.Support.V4.App 中找到它,但这还不够 对我来说 b/c 我正在尝试使用 Android.App.Fragment 的(不是 Android.Support.V4.App.Fragment 的) 并且在Android.App(不是Android.Support.V4.App)中有相关的类,我的代码不会 如果我从支持库中派生出我的寻呼机,则编译, 因为导致 Android.App 和 Android.Support.V4.App 之间的类型不匹配。

就像这里的案例 Cannot be cast to android.app.Fragment ,是否有我应该使用的“普通”寻呼机(PagerAdapter)类 FragmentPagerAdapter 或其他东西的位置(就像您从正常的 Activity 派生一样,并且 不是 FragmentActivity,当面向 API 11 或更高版本时)。

这是我正在使用的示例代码(它是位于 https://github.com/xamarin/monodroid-samples/tree/master/Support4 的 MonoDroid 示例中 Support4.sln 解决方案中的 FragmentPagerSupport.cs 文件)。

我已注释掉引用 Android.Support.V4.App 的行并将其替换为 引用 Android.App 的代码。 Android.Support.V4.App 之外没有我能找到的 FramePagerAdapter,我真的需要它。

谢谢。

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

最佳答案

android.support.v13.app.FragmentPagerAdapter 中有一个,它应该做你想做的事。它是不支持 Fragment 的 FragmentPagerAdapter。

Android Studio 安装

请添加follow Gradle依赖

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

关于android - FragmentPagerAdapter 仅存在于 Android.Support.V4.App(而不是 Android.App)中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13501424/

相关文章:

android - ITelephony.endCall() 不再适用于阻止 Android 8/Android O/API 26 中的调用

android - "AndEngine"的文档在哪里?

java - Android 直方图均衡

android - ListView 和 onItemClick 创建透明 fragment

java - 无法从 fragment 按钮启动 Activity

Xamarin - 更新 nuget 包导致错误

android - 不同进程中的 OnPreferenceChangeListener - 共享偏好数据

android - Fragment 中的 Asynctask 生命周期

xamarin.android - 将多个目标绑定(bind)到同一源

c# - Visual Studio 2015 - Xamarin - Android - 当我尝试在 .cs 文件中执行任何操作时获取 "resource.id does not contain a definition for xxx"