只存在于 Android. Support.V4.App (而不是 Android. App)中

我在 Android.App 中找不到 FragmentPagerAdapter。

我不想使用来自 Android. Support.V4.App 的片段,因为我的目标 API 是 14及以上版本(Android 4.0及以上版本), 还有相关的类。

我只在 Android. Support.V4.App 中找到了它,但这还不够 对我来说,我正在尝试使用 Android. App. Fragment 的(不是 Android. Support.V4.App. Fragment 的) 在 Android 中有相关的类。 App (不是 Android. Support.V4.App) ,我的代码不会 编译如果我派生我的页面从片段 PagerAdapter 如果它从支持库, 因为在 Android.App 和 Android.Support.V4.App 之间产生的类型不匹配。

就像这里的 无法强制转换为 android.app. 片段一样,是否有一个“普通”的寻呼机(PagerAdapter)类我应该在其中使用 片段页面适配器或其他东西的位置(就像你从正常的活动,和 而不是在针对 API 11或更高版本时的片段活动)。

下面是我正在处理的示例代码(它是来自 https://github.com/xamarin/monodroid-samples/tree/master/Support4上的 MonoDroid 示例的 Support4.sln 解决方案中的 fragmentpagersupport.cs 文件)。

我已经注释掉了引用 Android.Support.V4.App 的代码行,并将其替换为 引用 Android 的代码。应用程序。Android 之外没有 FramePagerAdapter。我可以找到的支持.V4.App,我真的很需要它)。

谢谢。

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);
}
}
}
}
50791 次浏览

有一个在 android.support.v13.app.FragmentPagerAdapter中,它应该做你想让它做的事情。它是一个针对非支持片段的 FragmentPagerAdapter。

Android Studio 安装

请添加如下划分依赖项

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

呃,您只需要使用 V13支持库中的 FragmentPagerAdapter 即可

Android.Support.V13.App.FragmentPagerAdapter

然后,除了 ViewPager 之外,所有其他与片段相关的类都可以从“普通”库/名称空间中使用,但这没什么大不了的。


下面是一个完整性示例(来自 https://github.com/xamarin/monodroid-samples/的修改过的“ Support4”示例) :

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>

将这种依赖关系添加到分级依赖关系中:

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

然后像这样使用 android.support.v13.app.FragmentPagerAdapter(我只是简单地修改了官方的演示项目在 android 工作室: file → new → new project → next → next → tab 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;
}
}
}

有同样的问题。我的解决方案是从 android.Support.v4.app 复制代码。然后将导入的 FragmentPagerAdapter 类更改为 android.app。碎片。然后进行其他次要的修改以消除所有错误。令我惊讶的是,它完美地工作。 IMO 这比添加一个你并不真正需要的支持库要简单。

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

根据2019年的安卓系统

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