图形页面谷歌地图NullPointerException异常? [英] MapView google maps NullPointerException?

查看:283
本文介绍了图形页面谷歌地图NullPointerException异常?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图创建一个如何获得使用图形页面。我创建了一个片段和XML来使用。问题是,当我尝试打开的MapView抛出一个 NullPointerException异常但我不能undertand原因。

我怎么能解决呢?

XML

 <的LinearLayout
    的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:方向=垂直
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent>    < com.google.android.gms.maps.MapView
        机器人:ID =@ + ID /图形页面
        机器人:layout_width =match_parent
        机器人:layout_height =160dp
        机器人:layout_marginRight =10dp/>< / LinearLayout中>

分片

 公共类FormComoChegarEm preSA延伸片段{
    MapView类MapView类;
    私人GoogleMap的GoogleMap的;
    私人最终字符串标记=的getClass()getSimpleName()+ - >中。    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        。((CustomDrawerLayout)getActivity())getSupportActionBar()隐藏();
    }    @覆盖
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,捆绑savedInstanceState){
        查看查看= inflater.inflate(R.layout.como_chegar_em preSA,容器,FALSE);
        图形页面=(图形页面)view.findViewById(R.id.mapView);
        返回视图。
    }    @覆盖
    公共无效onActivityCreated(捆绑savedInstanceState){
        super.onActivityCreated(savedInstanceState);
        setMapView();
    }    私人无效setMapView(){
        尝试{
            MapsInitializer.initialize(getActivity()getApplicationContext());
        }赶上(例外五){
            e.printStackTrace();
        }        GoogleMap的= mapView.getMap();
        //经纬度
        双纬度= 17.385044;
        双经度= 78.486671;        //创建标记
        的MarkerOptions标记=新的MarkerOptions()位置(
                新的经纬度(纬度,经度))标题(你好图)。        //更改标记图标
        marker.icon(BitmapDesc​​riptorFactory
                .defaultMarker(BitmapDesc​​riptorFactory.HUE_ROSE));        //添加标记
        googleMap.addMarker(标记);
        CameraPosition cameraPosition =新CameraPosition.Builder()
                。.TARGET(新经纬度(17.385044,78.486671))变焦(12).build();
        googleMap.animateCamera(CameraUpdateFactory
                .newCameraPosition(cameraPosition));        //此处执行任何相机更新
    }}

例外

 显示java.lang.NullPointerException
            在br.com.package.myapp.frags.FormComoChegarEm presa.setMapView(FormComoChegarEm presa.java:80)
            在br.com.package.myapp.frags.FormComoChegarEm presa.onActivityCreated(FormComoChegarEm presa.java:56)
            在android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1794)
            在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:967)
            在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
            在android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
            在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
            在android.support.v4.app.FragmentManagerImpl $ 1.run(FragmentManager.java:454)
            在android.os.Handler.handleCallback(Handler.java:733)
            在android.os.Handler.dispatchMessage(Handler.java:95)
            在android.os.Looper.loop(Looper.java:157)
            在android.app.ActivityThread.main(ActivityThread.java:5356)
            在java.lang.reflect.Method.invokeNative(本机方法)
            在java.lang.reflect.Method.invoke(Method.java:515)
            在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1265)
            在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
            在dalvik.system.NativeStart.main(本机方法)


解决方案

我面临着同样的问题,我在的GoogleMap和MapView的第一次尝试。

问题是,当你初始化地图,它需要很短的一段时间来加载(这它在背景中)。当您从图形页面获得的情况下,GoogleMap的价值仍然是空(未初始化)。

您需要使用<一个href=\"http://developer.android.com/reference/com/google/android/gms/maps/GoogleMap.OnMapLoadedCallback.html\"相对=nofollow> OnMapLoadedCallback 在这里。加入此回调的一个实例给的GoogleMap 右后 GoogleMap的= mapView.getMap(); 。回调的身体有一个称为函数 onMapLoaded(),其中你将以下code:

  googleMap.addMarker(标记);
CameraPosition cameraPosition =新CameraPosition.Builder()
        。.TARGET(新经纬度(17.385044,78.486671))变焦(12).build();
googleMap.animateCamera(CameraUpdateFactory
        .newCameraPosition(cameraPosition));

和任何为这样的人的GoogleMap&LT;&成员GT; 。我添加下面的编辑code你放心。

 私人无效setMapView(){    尝试{
        MapsInitializer.initialize(getActivity()getApplicationContext());
    }赶上(例外五){
        e.printStackTrace();
    }    GoogleMap的= mapView.getMap();    googleMap.setOnMapLoadedCallback(新OnMapLoadedCallback()
    {
        @覆盖
        公共无效onMapLoaded()
        {
            //经纬度
                双纬度= 17.385044;
                双经度= 78.486671;                //创建标记
                的MarkerOptions标记=新的MarkerOptions()位置(
                    新的经纬度(纬度,经度))标题(你好图)。                //更改标记图标
                marker.icon(BitmapDesc​​riptorFactory
                        .defaultMarker(BitmapDesc​​riptorFactory.HUE_ROSE));                //添加标记
                googleMap.addMarker(标记);
                CameraPosition cameraPosition =新CameraPosition.Builder()
                        。.TARGET(新经纬度(17.385044,78.486671))变焦(12).build();
                googleMap.animateCamera(CameraUpdateFactory
                        .newCameraPosition(cameraPosition));            //此处执行任何相机更新        }
    });
  }

I'm trying create a How to get using MapView. I created a Fragment and a XML to use that. The problem is when I try open the MapView throws a NullPointerException but I can't undertand why.

How could I solve it ?

XML

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.gms.maps.MapView
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="160dp"
        android:layout_marginRight="10dp" />

</LinearLayout>

The Fragment

public class FormComoChegarEmpresa extends Fragment{
    MapView mapView;
    private GoogleMap googleMap;
    private final String TAG = getClass().getSimpleName() + "->";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ((CustomDrawerLayout)getActivity()).getSupportActionBar().hide();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.como_chegar_empresa, container, false);
        mapView = (MapView)view.findViewById(R.id.mapView);


        return  view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setMapView();
    }

    private void setMapView() {
        try {
            MapsInitializer.initialize(getActivity().getApplicationContext());
        } catch (Exception e) {
            e.printStackTrace();
        }

        googleMap = mapView.getMap();
        // latitude and longitude
        double latitude = 17.385044;
        double longitude = 78.486671;

        // create marker
        MarkerOptions marker = new MarkerOptions().position(
                new LatLng(latitude, longitude)).title("Hello Maps");

        // Changing marker icon
        marker.icon(BitmapDescriptorFactory
                .defaultMarker(BitmapDescriptorFactory.HUE_ROSE));

        // adding marker
        googleMap.addMarker(marker);
        CameraPosition cameraPosition = new CameraPosition.Builder()
                .target(new LatLng(17.385044, 78.486671)).zoom(12).build();
        googleMap.animateCamera(CameraUpdateFactory
                .newCameraPosition(cameraPosition));

        // Perform any camera updates here
    }    

}

Exception

java.lang.NullPointerException
            at br.com.package.myapp.frags.FormComoChegarEmpresa.setMapView(FormComoChegarEmpresa.java:80)
            at br.com.package.myapp.frags.FormComoChegarEmpresa.onActivityCreated(FormComoChegarEmpresa.java:56)
            at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1794)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:967)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
            at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
            at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:454)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5356)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
            at dalvik.system.NativeStart.main(Native Method)

解决方案

I've faced the same issue with my first attempt at GoogleMap and MapView.

The issue is that when you init the map, it takes a short while to load (which it does in the background). When you obtain the instance from the MapView, the value of the GoogleMap is still null (not initialized).

You need to use OnMapLoadedCallback here. Add an instance of this callback to the googleMap right after googleMap = mapView.getMap();. The callback body has a function called onMapLoaded(), wherein you place the following code:

googleMap.addMarker(marker);
CameraPosition cameraPosition = new CameraPosition.Builder()
        .target(new LatLng(17.385044, 78.486671)).zoom(12).build();
googleMap.animateCamera(CameraUpdateFactory
        .newCameraPosition(cameraPosition));

and anything as the likes of 'googleMap.<member>'. I'm adding the edited code below for your ease.

private void setMapView() {

    try {
        MapsInitializer.initialize(getActivity().getApplicationContext());
    } catch (Exception e) {
        e.printStackTrace();
    }

    googleMap = mapView.getMap();

    googleMap.setOnMapLoadedCallback(new OnMapLoadedCallback()
    {
        @Override
        public void onMapLoaded()
        {
            // latitude and longitude
                double latitude = 17.385044;
                double longitude = 78.486671;

                // create marker
                MarkerOptions marker = new MarkerOptions().position(
                    new LatLng(latitude, longitude)).title("Hello Maps");

                // Changing marker icon
                marker.icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_ROSE));

                // adding marker
                googleMap.addMarker(marker);
                CameraPosition cameraPosition = new CameraPosition.Builder()
                        .target(new LatLng(17.385044, 78.486671)).zoom(12).build();
                googleMap.animateCamera(CameraUpdateFactory
                        .newCameraPosition(cameraPosition));

            // Perform any camera updates here

        }
    });
  } 

这篇关于图形页面谷歌地图NullPointerException异常?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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