FragmentPagerAdOG chỉ tồn tại trong Android.Support.V4.App (chứ không phải Android.App)


163

Tôi không thể tìm thấy FragmentPagerAd CHƯƠNG trong Android.App.

Tôi không muốn sử dụng Fragment's từ Android.Support.V4.App, vì API mục tiêu của tôi là 14 trở lên (Android 4.0 trở lên). Vì vậy, tôi muốn chỉ sử dụng đơn giản Android.App.Fragments và có các lớp liên quan.

Tôi chỉ tìm thấy nó trong Android.Support.V4.App, nhưng điều này không đủ cho tôi b / c Tôi đang cố gắng sử dụng Android.App.Fragment's (không phải Android.Support.V4.App.Fragment's) và ở đó các lớp liên quan trong Android.App (không phải Android.Support.V4.App) và mã của tôi sẽ không biên dịch nếu tôi lấy được máy nhắn tin của mình từ FragmentPagerAd CHƯƠNG nếu từ thư viện Hỗ trợ, do loại kết quả không khớp giữa Android.App và Android. .V4.App.

Cũng giống như trường hợp ở đây Không thể chuyển sang android.app.Fragment , có một lớp máy nhắn tin "bình thường" (PagerAd CHƯƠNG) mà tôi nên sử dụng thay cho FragmentPagerAd CHƯƠNG hoặc một cái gì đó (giống như bạn xuất phát từ Hoạt động bình thường và không phải là FragmentActivity, khi nhắm mục tiêu API 11 trở lên).

Đây là mã mẫu mà tôi đang làm việc (tệp FragmentPagerSupport.cs trong giải pháp Support4.sln từ các ví dụ MonoDroid được tìm thấy tại https://github.com/xamarin/monodroid-samples/tree/master/Support4 ).

Tôi đã nhận xét các dòng tham chiếu Android.Support.V4.App và thay thế chúng bằng mã tham chiếu Android.App. Không có FramePagerAd CHƯƠNG ngoài Android.Support.V4. Tôi có thể tìm thấy và tôi thực sự cần nó).

Cảm ơn.

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
Có một cái là trong android.support.v13.app.FragmentPagerAdapter. Không chắc điều đó có giúp gì cho bạn không, nhưng ...
PearsonArtPhoto

PearsonArtPhoto Không chắc chắn vì không có không gian tên Android.Support.V13.View (dù sao trong MonoDroid). Tôi hoàn toàn không sử dụng thư viện hỗ trợ, nhưng tôi chưa nghĩ nó có thể.
samis

Có vẻ như ViewPager chỉ tồn tại trong thư viện hỗ trợ ...
samis

developer.android.com/reference/android/support/v4/view/NH Phần Tổng quan về lớp tổng hợp khá nhiều tình huống khó khăn này - "Lưu ý rằng lớp này hiện đang được thiết kế và phát triển sớm. API có thể sẽ thay đổi trong các bản cập nhật sau của thư viện tương thích, yêu cầu thay đổi mã nguồn của ứng dụng khi chúng được biên dịch so với phiên bản mới hơn. "
samis

Một đoạn trích khác từ docs developer.android.com/tools/extras/support-l Library.html "Thư viện hỗ trợ cho v4 cung cấp quyền truy cập vào một số lớp được giới thiệu với Android 3.0 và hơn thế nữa, cùng với một số phiên bản cập nhật của các lớp hiện có và thậm chí một số API hiện không tồn tại trong nền tảng Android ". Tuy nhiên, tại sao họ lại để một mảnh "API" quan trọng như vậy trong thư viện hỗ trợ, nơi phần còn lại của nó tồn tại bên ngoài nếu nó. Có lẽ là một giám sát?
samis

Câu trả lời:


202

Có một cái là trong android.support.v13.app.FragmentPagerAdapterđó, nên làm những gì bạn muốn nó làm. Đó là một FragmentPagerAd CHƯƠNG cho các đoạn không hỗ trợ.

Cài đặt Android Studio

Vui lòng thêm theo phụ thuộc Gradle

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

8
Có một mớ hỗn độn theo nghĩa là bạn không thể sử dụng các đoạn lồng nhau và getChildFragmentManager () trong hỗ trợ lib 13.
Yar

3
sử dụng biên dịch 'com.android.support:support-v13:21.0.+' để xây dựng lớp
cV2

Studio android của tôi không giải quyết import android.support.v13.app.FragmentPagerAdapter;bất kỳ ý tưởng? chắc chắn đã thêm biên dịch 'com.android.support:support-v13:23.1.1' để phân loại
Muhammad Naderi

1
support:support-v13có mâu thuẫn với support:designtrường hợp của tôi
Konstantin Konopko

4
Nhưng bây giờ nó không được dùng trong api 27 -> để sử dụng lại phiên bản v4. Sau đó, chúng tôi lại gặp vấn đề, không có cách nào để sử dụng phần không hỗ trợ lib Fragment
Morten Holmgaard

16

Ugh, bạn chỉ cần sử dụng FragmentPagerAd CHƯƠNG từ thư viện hỗ trợ V13

Android.Support.V13.App.FragmentPagerAdapter

Sau đó, tất cả các lớp liên quan đến Fragment khác có thể được sử dụng từ các thư viện / không gian tên "bình thường", ngoại trừ ViewPager, nhưng đó không phải là vấn đề lớn.


Đây là một mẫu cho tính đầy đủ (ví dụ "Support4" đã sửa đổi từ 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>

2
Có một mớ hỗn độn theo nghĩa là bạn không thể sử dụng các đoạn lồng nhau và getChildFragmentManager () trong hỗ trợ lib 13.
Yar

2

Thêm phần phụ thuộc này vào phần phụ thuộc lớp:

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

Và sử dụng android.support.v13.app.FragmentPagerAdapternhư thế này (Tôi chỉ đơn giản sửa đổi dự án demo chính thức trong studio android: tệp → mới → dự án mới → tiếp theo → tiếp theo → hoạt động theo thẻ → tiếp theo → kết thúc):

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

Theo năm 2019 với AndroidX

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

-1

Có cùng một vấn đề. Giải pháp của tôi là sao chép mã từ android.support.v4.app.FragmentPagerAd CHƯƠNG, sau đó thay đổi lớp Fragment đã nhập thành android.app.Fragment. Sau đó thực hiện các điều chỉnh nhỏ khác để loại bỏ tất cả các lỗi. Thật ngạc nhiên, nó hoạt động hoàn hảo. IMO điều này đơn giản hơn việc thêm một thư viện hỗ trợ mà bạn không thực sự cần.

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;
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.