157

Nie mogę znaleźć FragmentPagerAdapter w Android.App.FragmentPagerAdapter istnieje tylko w Android.Support.V4.App (i nie Android.App)

Nie chcę używać Fragmentów z Android.Support.V4.App, ponieważ moim docelowym API jest 14 i wyżej (Android 4.0 i nowsze). Tak więc chcę po prostu użyć zwykłego Android.App.Fragments, i powiązanych klas.

Znalazłem tylko w Android.Support.V4.App, ale to nie wystarcza dla mnie b/c Próbuję użyć Android.App.Fragment (nie Android.Support.V4.App .Fragment) i tam są powiązane klasy w Android.App (nie Android.Support.V4.App), a mój kod nie będzie skompilować, jeśli wyprowadzę mój pager z FragmentPagerAdapter jeśli jest z biblioteki Support, z powodu wynikającego niedopasowania typu między Android.App i Android.Support.V4.App.

Podobnie jak w przypadku tutaj Cannot be cast to android.app.Fragment, czy istnieje „normalne” pager (PagerAdapter) klasa I powinien być używany w miejscu FragmentPagerAdapter czy coś (tak jak to wynika z normalnej działalności, a nie FragmentActivity, podczas kierowania API 11 lub nowszy).

Oto przykładowy kod, nad którym pracuję (jego plik FragmentPagerSupport.cs w rozwiązaniu Support4.sln z przykładów MonoDroid znalezionych pod https://github.com/xamarin/monodroid-samples/tree/master/Support4).

Skomentowałem linie odwołujące się do Android.Support.V4.App i zastąpiłem je kodem , który odwołuje się do Android.App. Nie ma FramePagerAdapter poza Android.Support.V4.App, który mógłbym znaleźć, i naprawdę tego potrzebuję).

Dzięki.

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

Jest taki, który znajduje się w 'android.support.v13.app.FragmentPagerAdapter'. Nie jestem pewien, czy to ci pomoże, ale ... – PearsonArtPhoto

+0

PearsonArtPhoto Nie jestem pewien, ponieważ nie istnieje przestrzeń nazw Android.Support.V13.View (w MonoDroid). Wolałbym w ogóle nie korzystać z biblioteki wsparcia, ale nie sądzę, aby była ona dostępna od teraz. – samosaris

+0

Wygląda na to, że program ViewPager istnieje również tylko w bibliotece pomocy technicznej ... – samosaris

Odpowiedz

192

Jest jeden, który jest w android.support.v13.app.FragmentPagerAdapter, co powinni robić, co chcesz to zrobić. Jest to FragmentPagerAdapter dla fragmentów nieobsługiwanych przez wsparcie.

Android Studio Instalacja

proszę dodać śledzić Gradle Zależności

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

Istnieje bałagan w tym sensie, że nie można używać zagnieżdżonych fragmentów i getChildFragmentManager() w bibliotece pomocniczej 13. – Yar

+2

użyć kompilacji 'com.android.support:support-v13:21.0.+' dla kompilacji gradle – cV2

+0

moje studio android nie robi nie rozwiązać 'importu android.support.v13.app.FragmentPagerAdapter;' jakiegokolwiek pomysłu? z pewnością już dodałem kompilację 'com.android.support:support-v13:23.1.1', aby zgrupować –

14

Ugh, po prostu trzeba użyć FragmentPagerAdapter z biblioteki wsparcia V13

Android.Support.V13.App.FragmentPagerAdapter 

Wtedy wszyscy inny fragment powiązane klasy mogą być używane z "normalnych" bibliotek/przestrzeni nazw, z wyjątkiem ViewPage r, ale to nic wielkiego.


Oto próbka dla kompletności (zmodyfikowany "Support4" Przykład z 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

Istnieje bałagan w tym sensie, że nie można używać zagnieżdżonych fragmentów i getChildFragmentManager() w bibliotece wsparcia 13. – Yar

2

Dodaj dependecy do Gradle zależności:

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

I używać android.support.v13.app.FragmentPagerAdapter tak (ja po prostu zmodyfikowany oficjalny projekt demo Android Studio: Plik → Nowy → nowego projektu → Dalej → Dalej → aktywności zakładkami → następne → mety):

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