新版百度地图可以使用fragment加载,网上有关的例子少之又少,只有若干java实现的例子。

Xamarin作为新生代的android开发利器如何使用fragment做tab页加载百度地图呢?

问题分两部分:

1. fragment实现tab页面

2. 将地图加到fragment中

先来说第一个问题:

传统的创建Tab页方式是用TabActivity,然后创建各个分页的Activity页面。但TabActivity后来被google废了,取而代之的是fragment,目前是主流。具体细节本文暂时不追究,但可以确认的是使用fragment结合ActionBar的方式会比用TabHost所建立的tab页节省画面空间。

 

首先,创建主页面

<?xml version=”1.0″ encoding=”utf-8″?>
< LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:minWidth=”25px”
android:minHeight=”25px”>
< FrameLayout
android:id=”@+id/fragmentContainer”
android:layout_width=”match_parent”
android:layout_height=”match_parent” />
< /LinearLayout>

 

然后再创建地图页面

<?xml version=”1.0″ encoding=”utf-8″?>
< LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”>
< Button
android:id=”@+id/MyButton”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:text=”@string/tab_map” />
< com.baidu.mapapi.map.MapView
android:id=”@+id/bmapView”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:clickable=”true” />
< /LinearLayout>

 

为了对比,在随便创建一个Tab页

<?xml version=”1.0″ encoding=”utf-8″?>
< LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”>
< Button
android:id=”@+id/MyButton”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:text=”@string/tab_msg” />
< /LinearLayout>

创建MainActivity.cs继承自Activity
实现OnCreate方法
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
this.ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;
var tab = this.ActionBar.NewTab();
tab.SetText(“Tab1″);
tab.TabSelected +=
(sender, e) =>
{
e.FragmentTransaction
.Replace(Resource.Id.fragmentContainer
, new MainActivity_Map());
};
this.ActionBar.AddTab(tab);

tab = this.ActionBar.NewTab();
tab.SetText(“Tab2″);
tab.TabSelected +=
(sender, e) =>
{
e.FragmentTransaction
.Replace(Resource.Id.fragmentContainer
, new MainActivity_Msg());
};
this.ActionBar.AddTab(tab);
}

 

然后分别实现MainActivity_Map和MainActivity_Msg类并继承自Fragment即可
public class MainActivity_Map : Fragment
{

}
public class MainActivity_Msg : Fragment
{

}
主要是实现override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)

基本上Tab的框架就差不多搭建起来了。
现在回到第二个问题,如何在Fragment中加载地图。申明一点,百度地图key申请配置之类的问题可以看百度开发者文档,已经说明的很清楚,不再赘述
地图页面的axml之前已经实现过了,剩下的工作就是将地图inflate进MainActivity_Map所属Fragment的地图中
这一步的时候花了点时间研究,一方面没有看到一篇百度地图相关文章直接继承自fragment,另一方面Xamarin在国内的使用者少之又少,这个问题好像没人关注,闲话少说,几经摸索找到了方法.
关键点是实现

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
base.OnCreateView(inflater, container, savedInstanceState);
SDKInitializer.Initialize(Application.Context);
var view = inflater.Inflate(Resource.Layout.Main_Map, container, false);
mMapView = (MapView)view.FindViewById(Resource.Id.bmapView);
return view;
}

至此,问题基本解决。

 

 

 

 

 

 

 

 

更多推荐