片段中的 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 为空的主要内容,如果未能解决你的问题,请参考以下文章
如何在用java创建的布局内创建地图片段(GoogleMap)?