157

我在Android.App中找不到FragmentPagerAdapter。FragmentPagerAdapter只存在於Android.Support.V4.App(而不是Android.App)

我不想使用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's) 以及Android.App(不是Android.Support.V4.App)中的相關類,並且我的代碼不會從 編譯,如果我從FragmentPagerAdapter派生我的尋呼機,如果它來自支持庫 由於生成的類型不匹配Android.App和Android.Support.V4.App之間。

正如這裏的情況Cannot be cast to android.app.Fragment,有一個「正常」的尋呼機(PagerAdapter)我應該用在 地方FragmentPagerAdapter或東西(就像你從正常活動中獲得,而 不FragmentActivity,瞄準時的類API 11或更高版本)。

以下是我正在使用的代碼示例代碼(其在來自MonoDroid示例的Support4.sln解決方案中的FragmentPagerSupport.cs文件,位於https://github.com/xamarin/monodroid-samples/tree/master/Support4處)。

我已經註釋掉了引用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); 
      } 
     } 
    } 
} 
+4

有一個在'android.support.v13.app.FragmentPagerAdapter'中。不知道這是否會幫助你,但... – PearsonArtPhoto

+0

PearsonArtPhoto不確定,因爲沒有Android.Support.V13.View命名空間(在MonoDroid中)。我寧願不使用支持庫,但我認爲它迄今尚不可能。 – samosaris

+0

看起來像ViewPager只存在於支持庫... – samosaris

回答

192

有一個在android.support.v13.app.FragmentPagerAdapter,它應該做你想做的事情。它是不支持片段的FragmentPagerAdapter。

的Android Studio安裝

請加跟隨搖籃相依

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

從某種意義上說,你不能在支持庫13中使用嵌套片段和getChildFragmentManager()。 – Yar

+2

使用compile'c​​om.android.support:support-v13:21.0.+'來編譯gradle – cV2

+0

我的android工作室不解決'導入android.support.v13.app.FragmentPagerAdapter;'任何想法?肯定已經添加了編譯'com.android.support:support-v13:23.1.1'到gradle –

14

哎,你只需要使用FragmentPagerAdapter從V13支持庫

Android.Support.V13.App.FragmentPagerAdapter 

然後,所有其他片段相關的類可以從「普通」庫/名稱空間中使用,但ViewPage除外r,但這沒什麼大不了的。


這裏是爲了完整性的樣品(經修飾的 「支承4」 從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> 
+1

從某種意義上說,你不能在支持庫13中使用嵌套片段和getChildFragmentManager()。 – Yar

2

此dependecy添加到gradle這個依賴關係:

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

而且使用android.support.v13.app.FragmentPagerAdapter像這樣(我只是修改的Android工作室的官方演示項目:文件→新建→新建項目→下一步→下一步→選項卡式活動→下一步→完成):

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; 
     } 
    } 
} 
相關問題