片段中的GoogleMap为空

时间:2014-08-19 23:56:07

标签: android google-maps android-fragments

我试图在片段中加载谷歌地图。问题是,当我调用getMap对象时,对findFragmentById的调用总是返回null。我看过那里的每一个帖子,几乎尝试了所有这些帖子并且无法解决这个问题。

我的app结构是这样的: 1.我有一个扩展ActionBarActivity的Activity(MINMainActivity)。 2.在onCreate中,我打电话给以下人员:

 mMainView = getLayoutInflater().inflate(R.layout.mimaster_drawer_layout, null);

mimaster_drawer_layout的来源是:

 <?xml version="1.0" encoding="utf-8"?>

<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/init_background">
</FrameLayout>
<ListView
    android:id="@+id/left_drawer"
    android:layout_width="300dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:choiceMode="singleChoice"
    android:divider="@android:color/black"
    android:dividerHeight="1dp"
    android:background="@android:color/darker_gray"/>

我使用动态的片段列表切换FrameLayout(content_frame)的内容。其中一个片段包含一个SupportMapFragment。类定义是:

 public class MINPageTypeMappingFragment extends Fragment

onCreateView代码是:

     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    // Inflate view
    //pageView = inflater.inflate(R.layout.page_mapping_fragment, container, false);
    pageView = inflater.inflate(R.layout.page_mapping_fragment, container, false);

    // Set up specific controls/views
    SetupMapIfNeeded();

    return pageView;
}

SetupMapIfNeeded的代码是:

     private void setUpMapIfNeeded() 
{
    // Do a null check to confirm that we have not already instantiated the map.
    if (mMap == null)
    {
        // Try to obtain the map from the SupportMapFragment.
        SupportMapFragment mapfrag = (SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map);
        if(mapfrag != null)
        {
            mMap = mapfrag.getMap();
        }

        // Check if we were successful in obtaining the map.
        if (mMap != null) {
            setUpMap();
        }
    }
}

page_mapping_fragment.xml是:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".MINMainActivity" >

<fragment
    xmlns:android="http://schemas.android.com/apk/res/android"
    class="com.google.android.gms.maps.MapFragment"
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

编辑:我知道该课程应该等于class =&#34; com.google.android.gms.maps.SupportMapFragment&#34;但是当我这样做时,它会在onCreateView的初始扩展期间崩溃。

我还包括清单文件的相关部分:

 <?xml version="1.0" encoding="utf-8"?>

<uses-sdk
    android:minSdkVersion="11"
    android:targetSdkVersion="19" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.AppCompat.Light.DarkActionBar"
    android:name="com.mobilityinitiative.ironman.MINApplication">

    <!-- Mobility Initiative Activities -->
    <activity android:name=".MINMainActivity"
              android:configChanges="orientation|screenSize|keyboardHidden"
              android:label="@string/title_minpagedefinition_list" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>


    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
    <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="@string/google_maps_key" />

</application>

就像我说的那样,悲伤的路线是:

             // Try to obtain the map from the SupportMapFragment.
        SupportMapFragment mapfrag = (SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map);

mapFrag始终为null。我是一个菜鸟的东西,所以请原谅我的无知。我还使用以下行获得了一个片段列表:

 List<Fragment> frags = getActivity().getSupportFragmentManager().getFragments();

这没有像预期的那样回归。我在列表中有3个片段: 1)MINPageTypeMappingFragment 2)RetainFragment - 来自ImageCache的片段 - 不相关 3)MINPageTypeGridFragment - 用MINPageTypeMappingFragment替换的上一个片段

我没有看到&#34; SupportMapFragment&#34;像我期望的那样。

我能找到的大多数示例代码都需要从FragmentActivity加载SupportMapFragment。就我而言,包含GoogleMap的片段是从MINMainActivity加载的(基于按钮事件):

             pageFragment = new MINPageTypeMappingFragment();
        pageFragment.setArguments(arguments);

        android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
        ft.replace(R.id.content_frame, pageFragment);
        ft.commit();

HELP !!!!!

修改:

我知道该课程应该等于class =&#34; com.google.android.gms.maps.SupportMapFragment&#34;但是当我这样做时,它会在onCreateView的初始扩展过程中崩溃:pageView = inflater.inflate(R.layout.page_mapping_fragment,container,false);我得到的错误是:&#34; InflateException:二进制XML文件第7行:错误膨胀类片段。&#34;

3 个答案:

答案 0 :(得分:1)

您正在使用标准地图片段类,因此如果您有FragmentManager而不是supportFragmentManager,请尝试此操作

private GoogleMap googleMap;

googleMap = ((MapFragment) getFragmentManager().findFragmentById(
                        R.id.map)).getMap(); 

答案 1 :(得分:0)

在尝试获取支持时,您正在使用标准的地图片段类。

将您的片段类替换为

class="com.google.android.gms.maps.SupportMapFragment"

答案 2 :(得分:0)

您在XMl文件中使用

class="com.google.android.gms.maps.MapFragment"

在java文件中使用了 SupportMapFragment support.v4库,这样就可以获得空指针异常。

您替换

中的代码

miMaster_drawer_layout

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                tools:context=".MINMainActivity" >

    <fragment
        xmlns:android="http://schemas.android.com/apk/res/android"
       class="com.google.android.gms.maps.SupportMapFragment"
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</RelativeLayout>
相关问题