Android 未在ViewPager中加载MapView控件

Android 未在ViewPager中加载MapView控件,android,android-viewpager,xamarin,android-mapview,Android,Android Viewpager,Xamarin,Android Mapview,我有一个MapView控件,我正试图将其加载到ViewPager中。ViewPager加载的是布局视图,而不是片段,因为ViewPager本身位于片段中,我希望避免片段场景中的片段 这是ViewPager的适配器,它将地图作为第四个屏幕加载: public class AmbientPagerAdapter : PagerAdapter { private ViewPagerWithMap pager; private CurrentLocationStatist

我有一个MapView控件,我正试图将其加载到ViewPager中。ViewPager加载的是布局视图,而不是片段,因为ViewPager本身位于片段中,我希望避免片段场景中的片段

这是ViewPager的适配器,它将地图作为第四个屏幕加载:

public class AmbientPagerAdapter : PagerAdapter {
        private ViewPagerWithMap pager;
        private CurrentLocationStatistics ambientData;
        private AmbientSearchBuilder searchBuilder;
        private AmbientSearchIndicatorBuilder searchIndicatorBuilder;
        private AmbientIndicatorBuilder indicatorBuilder;
        private AmbientMapBuilder mapBuilder;
        private Bundle savedInstanceState;

        public AmbientPagerAdapter(View view, CurrentLocationStatistics ambientData, Bundle savedInstanceState) {
            this.pager = view.FindViewById<ViewPagerWithMap> (Resource.Id.ambient_pager);
            this.ambientData = ambientData;
            this.savedInstanceState = savedInstanceState;

            SetupEvents ();
        }

        private void SetupEvents () {
            pager.Touch += (object sender, View.TouchEventArgs e) => {
                pager.Parent.RequestDisallowInterceptTouchEvent(true);
                e.Handled = false;
            };
        }

        #region Setup Views

        public override Java.Lang.Object InstantiateItem(View collection, int position) {
            var layoutInflater = (LayoutInflater)ApplicationContext.Activity.GetSystemService (Context.LayoutInflaterService);
            View view = null;
            switch (position) {
            case 0: 
                view = layoutInflater.Inflate (Resource.Layout.AmbientSearch, null);
                searchBuilder = new AmbientSearchBuilder (view, ambientData);
                break;
            case 1: 
                view = layoutInflater.Inflate (Resource.Layout.AmbientSearchIndicators, null);
                searchIndicatorBuilder = new AmbientSearchIndicatorBuilder (view, ambientData);
                break;
            case 2: 
                view = layoutInflater.Inflate (Resource.Layout.AmbientIndicators, null);
                indicatorBuilder = new AmbientIndicatorBuilder (view, ambientData);
                break;
            case 3: 
                view = layoutInflater.Inflate (Resource.Layout.AmbientMap, null);
                mapBuilder = new AmbientMapBuilder (view, ambientData, savedInstanceState);
                break;
            }

            // Add view to pager
            var viewPager = collection.JavaCast<ViewPager>();
            viewPager.AddView(view);

            return view;
        }

        public void Update (CurrentLocationStatistics ambientData) {
            this.ambientData = ambientData;
            if (searchBuilder != null) {
                searchBuilder.Update (ambientData);
            }
            if (searchIndicatorBuilder != null) {
                searchIndicatorBuilder.Update (ambientData);
            }
            if (indicatorBuilder != null) {
                indicatorBuilder.Update (ambientData);
            }
            if (mapBuilder != null) {
                mapBuilder.Update (ambientData);
            }
        }

        #endregion

        #region Infrastructure

        public override void DestroyItem(View collection, int position, Java.Lang.Object view) {
            var viewPager = collection.JavaCast<ViewPager>();
            viewPager.RemoveView (view as View);
            if (position == 3 && mapBuilder != null) {
                mapBuilder.OnDestroy ();
            }
        }

        public override bool IsViewFromObject(View view, Java.Lang.Object obj) {
            return view == obj;
        }

        public override IParcelable SaveState() {
            return null;
        }

        public override void StartUpdate(View arg0) {
        }

        public override void FinishUpdate(View arg0) {
        }

        public void UpdateVisibleItem (int index) {
            pager.SetCurrentItem (index, false);
        }

        public override int Count {
            get {
                return 4;
            }
        }

        #endregion

        public AmbientSearchBuilder SearchBuilder { get { return searchBuilder; } }
        public AmbientMapBuilder MapBuilder { get { return mapBuilder; } }
    }
公共类环境PagerAdapter:PagerAdapter{
私人视图页和地图页;
私有CurrentLocationStatistics环境数据;
私有环境searchBuilder searchBuilder;
私有环境搜索指示器构建器搜索指示器构建器;
私有环境指示器或构建器指示器或构建器;
私有AmbientMapBuilder mapBuilder;
私有Bundle savedInstanceState;
public AmbientPagerAdapter(查看视图、CurrentLocationStatistics环境数据、Bundle savedInstanceState){
this.pager=view.findviewbyd(Resource.Id.ambient_pager);
this.ambientData=ambientData;
this.savedInstanceState=savedInstanceState;
设置事件();
}
私有void SetupEvents(){
pager.Touch+=(对象发送者,View.TouchEventArgs e)=>{
pager.Parent.requestDisallowWinterCeptTouchEvent(true);
e、 已处理=错误;
};
}
#区域设置视图
public override Java.Lang.Object实例化项(视图集合,int位置){
var layoutInflater=(layoutInflater)ApplicationContext.Activity.GetSystemService(Context.LayoutInflaterService);
视图=空;
开关(位置){
案例0:
view=LayoutFlater.Inflate(Resource.Layout.AmbientSearch,null);
searchBuilder=新环境searchBuilder(视图,环境数据);
打破
案例1:
视图=LayoutFlater.Inflate(Resource.Layout.AmbientSearchIndicators,null);
searchIndicatorBuilder=新环境searchIndicatorBuilder(视图,环境数据);
打破
案例2:
视图=LayoutFlater.Inflate(Resource.Layout.AmbientIndicators,null);
indicatorBuilder=新的环境指标或Builder(视图,环境数据);
打破
案例3:
view=LayoutFlater.Inflate(Resource.Layout.AmbientMap,null);
mapBuilder=新环境mapBuilder(视图、环境数据、savedInstanceState);
打破
}
//向寻呼机添加视图
var viewPager=collection.JavaCast();
viewPager.AddView(视图);
返回视图;
}
公共无效更新(CurrentLocationStatistics环境数据){
this.ambientData=ambientData;
if(searchBuilder!=null){
searchBuilder.Update(环境数据);
}
if(searchIndicatorBuilder!=null){
searchIndicatorBuilder.Update(环境数据);
}
if(指示符builder!=null){
indicatorBuilder.Update(环境数据);
}
if(mapBuilder!=null){
mapBuilder.Update(环境数据);
}
}
#端区
#区域基础设施
公共覆盖项(视图集合、int位置、Java.Lang.Object视图){
var viewPager=collection.JavaCast();
viewPager.RemoveView(视图为视图);
如果(位置==3&&mapBuilder!=null){
mapBuilder.ondestory();
}
}
public override bool IsViewFromObject(视图,Java.Lang.Object obj){
返回视图==obj;
}
public override iparceable SaveState(){
返回null;
}
公共覆盖无效启动日期(视图arg0){
}
公共覆盖无效FinishUpdate(视图arg0){
}
公共void可更新项(整数索引){
pager.SetCurrentItem(索引,false);
}
公共覆盖整数计数{
得到{
返回4;
}
}
#端区
公共环境SearchBuilder SearchBuilder{get{return SearchBuilder;}}
公共环境MapBuilder MapBuilder{get{return MapBuilder;}}
}
一旦用户滑动到第三个屏幕,它就会实例化地图,因为ViewPager需要加载下一个屏幕,以便在滑动时可以同时显示这两个屏幕(默认的ViewPager行为)。这是否是问题的一部分,即它正在加载地图,而地图还不在视图中

下面是设置MapView的类。生命周期事件由承载ViewPager的片段调用

public class AmbientMapBuilder : AmbientBuilderBase {
        private View view;
        private TouchMapView mapView;
        private PropertyMapAdapter adapter;
        private Geolocation initialLocation;
        private CameraPosition lastCamera;
        private TinyMessageSubscriptionToken filterToken;

        public AmbientMapBuilder(View view, CurrentLocationStatistics ambientData, Bundle savedInstanceState = null) : base(ambientData) {
            this.view = view;
            this.mapView = view.FindViewById<TouchMapView> (Resource.Id.map);
            mapView.OnCreate (savedInstanceState);
            //MapsInitializer.Initialize (ApplicationContext.Activity);
        }

        public void Update (CurrentLocationStatistics ambientData) {
            this.ambientData = ambientData;
        }

        #region Lifecycle Events

        public void OnResume () {
            if (mapView != null)
                mapView.OnResume ();

            if (lastCamera != null) {
                if (adapter != null)
                    adapter.MoveMapToPosition (lastCamera);
                lastCamera = null;
            }
        }

        public void OnPause () {
            mapView.OnPause ();
            lastCamera = mapView.Map.CameraPosition;
            if (filterToken != null) {
                filterToken.Dispose ();
                filterToken = null;
            }
        }

        public void OnSaveInstanceState (Bundle outState) {
            var map = mapView;
            if (map != null)
                map.OnSaveInstanceState (outState);
        }

        public void OnLowMemory () {
            if (mapView != null) {
                mapView.OnLowMemory ();
            }
        }

        public void OnDestroy () {
            if (mapView != null) {
                mapView.OnDestroy ();
            }
        }

        #endregion

        public bool MapIsLoaded { get; set; }

        public PropertyMapAdapter MapAdapter {
            get { return adapter; }
        }

        public View View {
            get { return view; }
        }

        public TouchMapView MapView {
            get { return mapView; }
        }
    }
公共类AmbientMapBuilder:AmbientBuilderBase{
私人视野;
私有TouchMapView mapView;
私有财产适配器;
私人地理定位;
私家摄像机定位摄像机;
私有TinymessageSubscriptionTokenFilterToken;
public AmbientMapBuilder(查看视图,CurrentLocationStatistics ambientData,Bundle savedInstanceState=null):基本(ambientData){
this.view=视图;
this.mapView=view.findviewbyd(Resource.Id.map);
mapView.OnCreate(savedInstanceState);
//初始化(ApplicationContext.Activity);
}
公共无效更新(CurrentLocationStatistics环境数据){
this.ambientData=ambientData;
}
#区域生命周期事件
恢复时公开作废(){
如果(地图视图!=null)
mapView.OnResume();
如果(lastCamera!=null){
if(适配器!=null)
adapter.MoveMapToPosition(上一个摄像头);
lastCamera=null;
}
}
暂停时的公共无效(){
mapView.OnPause();
<RPR.Mobile.Droid.Widget.TouchMapView xmlns:map="http://schemas.android.com/apk/res-auto"
        android:id="@+id/map"
        map:cameraTargetLat="37.09024"
        map:cameraTargetLng="-95.712891"
        map:cameraZoom="3"
        map:uiCompass="false"
        map:uiRotateGestures="false"
        map:uiScrollGestures="true"
        map:uiTiltGestures="false"
        map:uiZoomGestures="true"
        map:uiZoomControls="false"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />