谷歌地图的GetMap返回null [英] Google Maps getMap returns null
问题描述
更新时间:
我读了很多的话题,但没有任何帮助或我不明白该怎么做。我得到空,我不知道为什么。我刚学,所以请帮助我。
显示java.lang.NullPointerException:尝试调用虚拟方法无效com.google.android.gms.maps.SupportMapFragment.getMapAsync(com.google.android.gms.maps.OnMa$p$padyCallback)'在一个空对象引用
在com.example.text.fragments.MapFragment.initilizeMap(MapFragment.java:52)
在com.example.text.fragments.MapFragment.onViewCreated(MapFragment.java:46)
在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:971)
在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1136)
在android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1499)
在android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:488)
在android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
在android.support.v4.view.ViewPager.populate(ViewPager.java:1073)
在android.support.v4.view.ViewPager.populate(ViewPager.java:919)
在android.support.v4.view.ViewPager $ 3.run(ViewPager.java:249)
在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:792)
在android.view.Choreographer.doCallbacks(Choreographer.java:596)
在android.view.Choreographer.doFrame(Choreographer.java:556)
在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:778)
在android.os.Handler.handleCallback(Handler.java:739)
在android.os.Handler.dispatchMessage(Handler.java:95)
在android.os.Looper.loop(Looper.java:155)
在android.app.ActivityThread.main(ActivityThread.java:5696)
在java.lang.reflect.Method.invoke(本机方法)
在java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1028)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
这是片段,我实现的GetMap
公共类MapFragment扩展片段实现OnMa $ P $ {padyCallback 私人GoogleMap的GoogleMap的;
/ **
*函数来加载地图。如果地图不创建它会为您创建它
* * /
@覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,捆绑savedInstanceState){
查看查看= inflater.inflate(R.layout.map_fragment,集装箱,FALSE);
返回视图。
}
@覆盖
公共无效onViewCreated(查看视图,捆绑savedInstanceState){
// TODO自动生成方法存根
super.onViewCreated(查看,savedInstanceState);
//这里,DOC说,地图可以初始化,或者服务不可用
initilizeMap();
} 私人无效initilizeMap(){
如果(GoogleMap的== NULL){
((SupportMapFragment)getActivity()。getSupportFragmentManager()。findFragmentById(
R.id.map))getMapAsync(本)。 //检查是否映射成功与否创建
如果(GoogleMap的== NULL){
Toast.makeText(getActivity()。getApplicationContext(),
对不起!无法创建地图,Toast.LENGTH_SHORT)
。显示();
}
}
} @覆盖
公共无效onMa pready(GoogleMap的mGoogleMap){
GoogleMap的= mGoogleMap;
}
}
这是map_fragment.xml
<的RelativeLayout的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:layout_width =match_parent
机器人:layout_height =match_parent
> <片段
机器人:ID =@ + ID /图
机器人:名字=com.google.android.gms.maps.SupportMapFragment
机器人:layout_width =match_parent
机器人:layout_height =match_parent/>
< / RelativeLayout的>
这是我的清单
<?XML版本=1.0编码=UTF-8&GT?;
<清单的xmlns:机器人=http://schemas.android.com/apk/res/android
包=com.example.test> <许可
机器人:名字=com.example.test.permission.MAPS_RECEIVE
安卓的ProtectionLevel =签名/> <使用许可权的android:NAME =com.example.test.permission.MAPS_RECEIVE/> <用途-SDK
安卓的minSdkVersion =17
机器人:targetSdkVersion =22/> <使用许可权的android:NAME =android.permission.ACCESS_NETWORK_STATE/>
<使用许可权的android:NAME =android.permission.INTERNET对/>
<使用许可权的android:NAME =com.google.android.providers.gsf.permission.READ_GSERVICES/>
<使用许可权的android:NAME =android.permission.WRITE_EXTERNAL_STORAGE/> <! - 必须出示当前位置 - >
<使用许可权的android:NAME =android.permission.ACCESS_COARSE_LOCATION/>
<使用许可权的android:NAME =android.permission.ACCESS_FINE_LOCATION/> <! - 所需的OpenGL ES 2.0。对于地图V2 - >
<用途特征
机器人:glEsVersion =0x00020000
机器人:要求=真/> <应用
机器人:allowBackup =真
机器人:图标=@的mipmap / ic_launcher
机器人:标签=@字符串/ APP_NAME
机器人:主题=@风格/ AppTheme
机器人:supportsRtl =真正的>
<活动
机器人:名字=。MainActivity
机器人:标签=@字符串/ APP_NAME>
&所述;意图滤光器>
<作用机器人:名字=android.intent.action.MAIN/> <类机器人:名字=android.intent.category.LAUNCHER/>
&所述; /意图滤光器>
< /活性GT; &所述;元数据
机器人:名字=com.google.android.maps.v2.API_KEY
机器人:值=AIzaSyBUeq6ANw9MyK9vwB4phnSOkp6e_UccN4E/> < /用途>< /清单>
我用滑片和一个标签必须有地图。我创建此地图在code的这部分ViewPagerAdapter:
@覆盖
公共片段的getItem(INT位置){ 如果(mNumbOfTabs == 3){
如果(位置== 0){
A中新= A();
返回;
}否则如果(位置== 1){
B B =新的B();
返回b;
}其他{
MapFragment mapFragment =新MapFragment();
返回mapFragment;
}
}
由于6.5版本的播放服务的谷歌的建议使用异步获取的GoogleMap 和的GetMap()
现在是很precated。由于 stkent 的提到你必须调用 getMapAsync(本)
。
当你需要一些回调这个方法这个方法是异步的,这就是为什么你也必须让你的片段实施 OnMa preadyCallback
和方法 onMa pready()
。
另外换线<$c$c>((SupportMapFragment)getActivity().getSupportFragmentManager().findFragmentById(R.id.map)).getMapAsync(this);$c$c>至<$c$c>((SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map)).getMapAsync(this);$c$c> 里面的片段,因为你必须使用ChildFragmentManager。
UPDATED I read many topics but nothing helped or I didn't understand what to do. I get null and I don't know why. I am just learning so please help me.
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.SupportMapFragment.getMapAsync(com.google.android.gms.maps.OnMapReadyCallback)' on a null object reference
at com.example.text.fragments.MapFragment.initilizeMap(MapFragment.java:52)
at com.example.text.fragments.MapFragment.onViewCreated(MapFragment.java:46)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:971)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1136)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1499)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:488)
at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1073)
at android.support.v4.view.ViewPager.populate(ViewPager.java:919)
at android.support.v4.view.ViewPager$3.run(ViewPager.java:249)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:792)
at android.view.Choreographer.doCallbacks(Choreographer.java:596)
at android.view.Choreographer.doFrame(Choreographer.java:556)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:778)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:155)
at android.app.ActivityThread.main(ActivityThread.java:5696)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
This is Fragment where I implemented getMap
public class MapFragment extends Fragment implements OnMapReadyCallback{
private GoogleMap googleMap;
/**
* function to load map. If map is not created it will create it for you
* */
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.map_fragment, container, false);
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onViewCreated(view, savedInstanceState);
// here, as doc say, the map can be initialized, or the service is not available
initilizeMap();
}
private void initilizeMap() {
if (googleMap == null) {
((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(
R.id.map)).getMapAsync(this);
// check if map is created successfully or not
if (googleMap == null) {
Toast.makeText(getActivity().getApplicationContext(),
"Sorry! unable to create maps", Toast.LENGTH_SHORT)
.show();
}
}
}
@Override
public void onMapReady(GoogleMap mGoogleMap) {
googleMap = mGoogleMap;
}
}
This is map_fragment.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<fragment
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
This is my manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.test" >
<permission
android:name="com.example.test.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />
<uses-permission android:name="com.example.test.permission.MAPS_RECEIVE" />
<uses-sdk
android:minSdkVersion="17"
android:targetSdkVersion="22" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- Required to show current location -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Required OpenGL ES 2.0. for Maps V2 -->
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:supportsRtl="true">
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<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.maps.v2.API_KEY"
android:value="AIzaSyBUeq6ANw9MyK9vwB4phnSOkp6e_UccN4E" />
</application>
</manifest>
I use sliding tabs and in one tab has to have map. I create this map in this part of code in ViewPagerAdapter:
@Override
public Fragment getItem(int position) {
if(mNumbOfTabs == 3) {
if (position == 0) {
A a = new A();
return a;
} else if (position == 1) {
B b = new B();
return b;
} else {
MapFragment mapFragment = new MapFragment();
return mapFragment;
}
}
Since the 6.5 version of Play Services Google recommends using of asynchronous getting of GoogleMap and getMap()
is now deprecated. As stkent's mentioned you have to call getMapAsync(this)
.
As this method asynchronous you need some callback for this method, that's why also you have to make your fragment implementing OnMapReadyCallback
and in the method onMapReady()
of these callbacks you can get reference to the map.
Also change line ((SupportMapFragment)getActivity().getSupportFragmentManager().findFragmentById(R.id.map)).getMapAsync(this);
to ((SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map)).getMapAsync(this);
'cause inside fragment you have to use ChildFragmentManager.
这篇关于谷歌地图的GetMap返回null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!