如何在Fragment类中包含Google Map片段?

时间:2014-12-16 23:23:45

标签: android google-maps android-layout fragment mapfragment

我想添加标记并在地图中的两个位置之间绘制折线。问题是当我尝试从Fragment类引用Googlemap时抛出异常。

就像这样,我有一个扩展Fragment类的类,并且使用普通的xml布局设置了fragment类的视图。此外,此布局包含一个片段,这是谷歌地图所在的位置。

以下是包含地图片段的片段布局代码;

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:background="#ffffff"
android:layout_height="match_parent">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingTop="20dp"
    >

    <EditText
        android:id="@+id/from"
        android:layout_width="300dp"
        android:layout_gravity="center"
        android:hint="Enter the starting location"
        android:layout_height="wrap_content"></EditText>

    <Button
        android:id="@+id/btn_showDirections"
        android:layout_width="wrap_content"
        android:layout_gravity="center"
        android:text="Show Directions"
        android:layout_height="wrap_content" />

    <fragment
        android:layout_width="match_parent"
        android:tag="HelloMap"
        android:layout_height="300dp"
        android:layout_margin="10dp"
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        />





</LinearLayout>

这是连接到给定布局文件的类

 public class frg_planVisit_directionsToZoo extends Fragment {

        GoogleMap mMap;

        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


            try{
                mMap = ((SupportMapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();
            }
            catch (Exception exp)
            {
                Log.i("Chin",exp.toString());
            }

            return inflater.inflate(R.layout.frg_planvisit_directions_to_zoo,container,false);
        }

}

保存地图片段的片段连接到一个活动,它工作正常。在我获得对谷歌地图的引用的代码中引发了异常。

mMap = ((SupportMapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();

如果这是错的,有人可以帮我看一下地图的参考吗?我是Android的新手。

为方便起见,我会在堆栈跟踪中发布一些重要内容。

*12-17 04:00:24.533  19369-19369/com.android.ZooCeylon I/Chin﹕ java.lang.NullPointerException
12-17 04:00:25.423  19369-19374/com.android.ZooCeylon E/dalvikvm﹕ GC_CONCURRENT freed 359K, 8% free 13026K/14087K, paused 13ms+4ms, total 40ms
12-17 04:00:25.583  19369-19374/com.android.ZooCeylon E/dalvikvm﹕ GC_CONCURRENT freed 870K, 11% free 13647K/15239K, paused 7ms+15ms, total 64ms
12-17 04:00:26.013  19369-19369/com.android.ZooCeylon W/System.err﹕ Invalid int: ""
12-17 04:00:27.943  19369-19369/com.android.ZooCeylon I/Choreographer﹕ Skipped 207 frames!  The application may be doing too much work on its main thread.
12-17 04:00:30.173  19369-19614/com.android.ZooCeylon W/System.err﹕ java.lang.NullPointerException*

2 个答案:

答案 0 :(得分:0)

据我记得,map在一段时间后在后台线程上初始化。有一些回调。您可以使用谷歌示例或从您的ide创建地图活动来检查它应该如何完成。

答案 1 :(得分:-1)

正如Eugen Pechanec所说,首先需要在OnActivityCreate()而不是OncreateView()中移动代码,         

此外,您必须确保手机上提供Google Play服务,否则您将获得GoogleMap null。您可以添加以下代码来检查是否安装了playservices。

if(map == null){
    int isEnabled = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity());
    if (isEnabled != ConnectionResult.SUCCESS) {
           GooglePlayServicesUtil.getErrorDialog(isEnabled, getActivity(), 0);
        }
       }
    else{
        //Continue what you were doing.
      }