2016-10-26 14 views
3

CirclePageIndicator를 ViewPagerIndicator에서 사용하면 내 앱이 충돌하는 경우가 있습니다.ViewPagerIndicator가 임의의 충돌을 일으킴

System.MethodAccessException: Method `(wrapper dynamic-method) object:dynamic_callback_0 (intptr,intptr)' is inaccessible from method `AnatoliAndroid.Components.CirclePageIndicator/SavedState:InitializeCreator()' 

at com.xxx.anatoli.app.iveMethods:java_interop_jnienv_alloc_object(intptr_intptr&_intptr.args:1337) 
at Java.Interop.JniEnvironment+Object.AllocObject(Java.Interop.JniObjectReference_type.args:1337) 
at Java.Interop.JniType.AllocObject(.args:1337) 
at Java.Interop.JniPeerMembers+JniInstanceMethods.StartCreateInstance(System.String_constructorSignature__System.Type_declaringType__Java.Interop.JniArgumentValue*_parameters.args:1337) 
at Android.Views.View+BaseSavedState..ctor(Android.OS.IParcelable_superState.args:1337) 
at com.xxx.anatoli.app.AnatoliAndroid.Components.CirclePageIndicator+SavedState..ctor(Android.OS.IParcelable_superState.args:1337) 
at com.xxx.anatoli.app.AnatoliAndroid.Components.CirclePageIndicator.OnSaveInstanceState(.args:1337) 
at Android.Views.View.n_OnSaveInstanceState(System.IntPtr_jnienv__System.IntPtr_native__this.args:1337) 

이는 OnCreateView입니다 : :이 같은 CirclePageIndicator 및 ViewPager를 넣어 XML로

public class SlideShowAdapter : FragmentPagerAdapter 
    { 
     List<string> _images; 
     public SlideShowAdapter(Android.Support.V4.App.FragmentManager manager, List<string> images) : base(manager) 
     { 
      _images = images; 
     } 
     public override int Count 
     { 
      get 
      { 
       return _images.Count; 
      } 
     } 

     public override Android.Support.V4.App.Fragment GetItem(int position) 
     { 
      var fragment = new SliderItemFragment(); 
      fragment.Arguments = new Bundle(); 
      fragment.Arguments.PutString("image", _images[position]); 
      return fragment; 
     } 

     public class SliderItemFragment : Android.Support.V4.App.Fragment 
     { 
      string _image; 
      public override void OnCreate(Bundle savedInstanceState) 
      { 
       base.OnCreate(savedInstanceState); 
       if (Arguments != null) 
       { 
        _image = Arguments.GetString("image"); 
       } 
      } 
      public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
      { 
       var view = inflater.Inflate(Resource.Layout.row_slider_item, null); 
       var imageView = view.FindViewById<ImageView>(Resource.Id.slider_imageview); 
       Picasso.With(Context).Load(_image).Placeholder(Resource.Drawable.profile_toolbar).Into(imageView); 
       return view; 
      } 
     } 
    } 

: 여기

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     var view = inflater.Inflate(Resource.Layout.fragment_home, null); 
     var viewPager = view.FindViewById<ViewPager>(Resource.Id.slider_location); 
     viewPager.Adapter = new SlideShowAdapter(FragmentManager, new List<string> { 
      "http://www.dalih.net/v1/wp-content/uploads/2014/12/wooden-backdrops.jpg", 
      "http://www.intrawallpaper.com/static/images/abstract-mosaic-background.png", 
      "http://www.intrawallpaper.com/static/images/gradient-background.jpg", 
      "http://www.intrawallpaper.com/static/images/518164-backgrounds.jpg" 
     }); 
     CirclePageIndicator indicator = view.FindViewById<CirclePageIndicator>(Resource.Id.indicator); 
     indicator.SetViewPager(viewPager); 
     int i = 0; 
     viewPager.PageSelected += (object sender, ViewPager.PageSelectedEventArgs e) => 
     { 
      i = e.Position; 
     }; 

     Task.Factory.StartNew(async() => 
     { 
      while (true) 
      { 
       await Task.Delay(6000); 
       Activity.RunOnUiThread(() => 
       { 
        viewPager.SetCurrentItem(i + 1 < viewPager.Adapter.Count ? ++i : i = 0, true); 
       }); 
      } 
     }); 

     return view; 
    } 

그리고 어댑터 여기 스택 추적은

<RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 
      <android.support.v4.view.ViewPager 
       android:id="@+id/slider_location" 
       android:layout_width="match_parent" 
       android:layout_height="200dp"> 
      </android.support.v4.view.ViewPager> 
      <AnatoliAndroid.Components.CirclePageIndicator 
       android:layout_alignParentBottom="true" 
       android:id="@+id/indicator" 
       android:padding="10dip" 
       android:layout_height="wrap_content" 
       android:layout_width="fill_parent"/> 
     </RelativeLayout> 

AnatoliAndroid.Components.CirclePageIndicator에 대해 ViewPagerIndicator에서 복사하여 붙여 넣습니다.

+0

가이 문제에 대해 제기 버그 리포트가를 : https://bugzilla.xamarin.com/ show_bug.cgi? id = 45998 – jgoldberger

+0

@jgoldberger 링크 상태의 구현과 오버라이드 된 메소드를 링크에서 제공된 코드에서 완전히 제거하고 작동했습니다. –

답변

0

문제는 여기에 static 생성자처럼 보인다 : 그것은 정의 된 액세스 한정자가 없습니다

https://github.com/xamarin/monodroid-samples/blob/fb9d4ed266bdf68bb1f9fa9933130b285712ec82/ViewPagerIndicator/ViewPagerIndicator/Library/CirclePageIndicator.cs#L544

때문에, 기본적으로 private로 설정 얻을 것이다. 따라서 이것을 public으로 표시해야합니다.

[ExportField("CREATOR")] 
    private static CirclePageIndicator.SavedState.SavedStateCreator InitializeCreator() 
    { 
    return new CirclePageIndicator.SavedState.SavedStateCreator(); 
    } 

가 인해 오류 메시지에서 언급 한대로 개인 인에 접근 할 수없는 :

따라서 다음 생성 된 코드 (당신을 가정하면 위의 ViewPagerIndicator 샘플을 복사).

다른 대부분의 샘플 대신 public 방법을 사용하는 규칙에 따라 마치

:

https://github.com/xamarin/monodroid-samples/search?utf8=%E2%9C%93&q=%5BExportField+%28%22CREATOR%22%29%5D&type=Code