Android 未在ViewPager中加载MapView控件
我有一个MapView控件,我正试图将其加载到ViewPager中。ViewPager加载的是布局视图,而不是片段,因为ViewPager本身位于片段中,我希望避免片段场景中的片段 这是ViewPager的适配器,它将地图作为第四个屏幕加载: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
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" />