片段中的 GoogleMap 为空

Posted

技术标签:

【中文标题】片段中的 GoogleMap 为空【英文标题】:GoogleMap in fragment is null 【发布时间】:2014-10-13 05:24:43 【问题描述】:

我正在尝试在片段中加载谷歌地图。问题是当我调用获取 GoogleMap 对象时,对 findFragmentById 的调用总是返回 null。我已经查看了那里的每个帖子并尝试了几乎所有帖子,但无法弄清楚。

我的应用结构是这样的: 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_
    android:layout_
    android:background="@drawable/init_background">
</FrameLayout>
<ListView
    android:id="@+id/left_drawer"
    android:layout_
    android:layout_
    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_
            android:layout_
            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_
    android:layout_/>

编辑:我知道该类应该等于 class="com.google.android.gms.maps.SupportMapFragment" 但是当我这样做时,它会在 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 始终为空。我是个菜鸟,所以请原谅我的无知。我还使用以下行获得了片段列表:

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

这并没有按预期返回。我在列表中有 3 个片段: 1) MINPageTypeMappingFragment 2) RetainFragment - 来自 ImageCache 的片段 - 不相关 3) MINPageTypeGridFragment - 上一个被 MINPageTypeMappingFragment 替换的片段

我没有看到我预期的“SupportMapFragment”。

我能找到的大多数示例代码都需要从 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();

求助!!!!!!

编辑:

我知道该类应该等于 class="com.google.android.gms.maps.SupportMapFragment" 但是当我这样做时,它会在 onCreateView 的初始扩展期间崩溃: pageView = inflater.inflate(R .layout.page_mapping_fragment,容器,假);我得到的错误是:“InflateException:二进制 XML 文件第 7 行:膨胀类片段时出错。”

【问题讨论】:

您好!我遇到了同样的问题。如果您在另一个片段中使用 mapFragment,请尝试使用 getChildFragmentManager() 而不是 getSupportFragmentManager()。 【参考方案1】:

您使用的是标准地图片段类,因此如果您有 FragmentManager 但不支持FragmentManager,请尝试此操作

private GoogleMap googleMap;

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

【讨论】:

这成功了!!!但这是我的问题。为什么我不能使用 SupportMapFragment?如果我将 XML 文件中的类 def 更改为 SupportMapFragment,它会在 inflate 调用期间在 onCreateView 中崩溃(异常)。例外是:“InflateException:二进制 XML 文件第 7 行:膨胀类片段时出错。”我想我需要使用 SupportMapFragment 还是?我需要向后兼容。 如果你将 XML 文件中的类 def 更改为 SupportMapFragment 然后使用 getSupportFragmentManager 找到片段,其余部分由@Dilavar 解释 我明白这一点。问题是当我尝试扩充 XML 时出现异常: pageView = inflater.inflate(R.layout.page_mapping_fragment, container, false);由于我得到了那个异常,我从来没有得到调用 getSupportFragmentManager 的代码。由于某种原因,inflate 调用不喜欢等于 ​​class="com.google.android.gms.maps.SupportMapFragment" 的类。如果该行是:class="com.google.android.gms.maps.MapFragment",我没有得到异常。现在我又回到了起点。 XML文件page_mapping_fragment在哪里 对不起。我错过了上面的标签。我刚刚纠正了它。我还刚刚实现了 Kalab 在***.com/questions/14565460/… 上发布的解决方案。这行得通,但我仍然很困惑为什么我们不能在 xml 中扩展它。【参考方案2】:

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

将您的片段类替换为

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

【讨论】:

我试过这个,现在它在 onCreateView 上崩溃了: pageView = inflater.inflate(R.layout.page_mapping_fragment, container, false);我得到的错误是:“InflateException: Binary XML file line 7: Error inflating class fragment。”【参考方案3】:

您在 XML 文件中使用

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

在您使用 SupportMapFragment 的 java 文件中,这是 support.v4 库 使用,因此您会得到空指针异常。

你替换你的代码

miMaster_drawer_layout

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_
                android:layout_
                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_
        android:layout_/>
</RelativeLayout>

【讨论】:

我在另一个答案上添加了这个评论,但以防万一,我也把它放在这里。我试过这个,现在它在 onCreateView 上崩溃了: pageView = inflater.inflate(R.layout.page_mapping_fragment, container, false);我得到的错误是:“InflateException: Binary XML file line 7: Error inflating class fragment。”

以上是关于片段中的 GoogleMap 为空的主要内容,如果未能解决你的问题,请参考以下文章

将片段与 GoogleMap 一起使用时应用程序崩溃

除非再次初始化GoogleMap,否则位置为空

如何在用java创建的布局内创建地图片段(GoogleMap)?

以编程方式将 GoogleMap 添加到片段

如何在片段中访问 getSupportFragmentManager()?

如何在片段中访问 getSupportFragmentManager()?