2016-10-26 2 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からコピーして貼り付けました。問題はここにstaticコンストラクタのように見えます

+0

ありshow_bug.cgi?id = 45998 – jgoldberger

+0

@jgoldberger私は完全に保存された状態の実装を削除し、リンクで提供されているコードからオーバーライドされたメソッドを削除しました。 –

答えて

0

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

それが定義されたアクセス修飾子を持っていないので、それはデフォルトでprivateに設定されます。だからあなたはそれをpublicにする必要があります。したがって、次の生成されたコード

を(あなたが上記のViewPagerIndicatorサンプルをコピーしたと仮定):

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

することはあなたのエラーメッセージに述べたように、それはプライベートであることにアクセスできなくなるでしょう。

他のサンプルのほとんどが代わりにpublicメソッドを使用しての規則に従うように見えます:https://bugzilla.xamarin.com/:この問題について提出されたバグレポートは

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

関連する問題