谷歌地图的GetMap返回null [英] Google Maps getMap returns null

查看:245
本文介绍了谷歌地图的GetMap返回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:机器人=htt​​p://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:机器人=htt​​p://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_STORAG​​E/>    <! - 必须出示当前位置 - >
    <使用许可权的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>((SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map)).getMapAsync(this); 里面的片段,因为你必须使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆