在 MapFragment 中获取 java.lang.NullPointerException

Getting java.lang.NullPointerException in MapFragment

我在我的应用程序中使用 GoogleMaps。为此,我在自定义 Fragment class 中实现了 SupportMapFragment Map-v2。但不幸的是,我在行

中无缘无故地收到 NullPointerException
SupportMapFragment fm = ((SupportMapFragment) getActivity ().getSupportFragmentManager ().findFragmentById (R.id.map));
            googleMap = fm.getMap();

我真的不知道该怎么办,我完全无能为力。我什至提到了 link 1, link 2 and 中的几个类似问题。但似乎没有任何结果。请帮我解决这个问题。请找出我的logcat错误,完整代码如下

MapFragment.java

public class MapFragment extends Fragment implements GoogleMap.OnMarkerClickListener {

    GoogleMap googleMap;    
    private Map<Marker, Integer> markerPosition = new HashMap ();
    private ImageView imgUser;
    private TextView txtName, txtLocation,txtCount;
    private ArrayList<Info> mList;

    public static MapFragment newInstance() {
        MapFragment fragment = new MapFragment();
        return fragment;
    }

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_map, container, false);
        findViews (view);
        googleMapsData ();
        return view;
    }



    @Override
    public void onViewCreated (View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated (view, savedInstanceState);
        mList = getHelper ().getList ();
        counts ();
    }

    private void googleMapsData () {
        int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable (getActivity ());
        if(status!= ConnectionResult.SUCCESS){ 

            int requestCode = 10;
            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, getActivity (), requestCode);
            dialog.show();

        }else { 

            SupportMapFragment fm = ((SupportMapFragment) getActivity ().getSupportFragmentManager ().findFragmentById (R.id.map)); //This is the line getting error
            googleMap = fm.getMap(); //This is the line getting error
            googleMap.setMapType (GoogleMap.MAP_TYPE_NORMAL);
            googleMap.setOnMarkerClickListener(this);
            googleMap.setMyLocationEnabled(true);

                for(int i=0;i<mList.size ();i++){
                    drawMarker (new LatLng (Double.parseDouble (mList.get (i).getLatitude ()), Double.parseDouble (mList.get (i).getLongitude ())),i);
                }

            CameraPosition cameraPosition = new CameraPosition.Builder()
                    .target (new LatLng (Double.parseDouble ("13.0900"), Double.parseDouble ("80.2700")))
                    .zoom (7)                              
                    .build ();                   


            googleMap.animateCamera(CameraUpdateFactory.newCameraPosition (cameraPosition), new GoogleMap.CancelableCallback () {

                @Override
                public void onFinish() {
                    CameraUpdate cu_scroll = CameraUpdateFactory.scrollBy(-300, 70);
                    googleMap.animateCamera(cu_scroll);
                }

                @Override
                public void onCancel() {
                }
            });
        }

        googleMap.setOnMapClickListener(new OnMapClickListener () {
            @Override
            public void onMapClick(LatLng point) {
            }
        });


        googleMap.setOnMapLongClickListener(new OnMapLongClickListener () {
            @Override
            public void onMapLongClick(LatLng point) {
            }
        });
    }


    public void details(Info Info){
        cardBottomdetails.setVisibility (View.VISIBLE);
        txtName.setText (Info.getHotelName ());
        txtLocation.setText (Info.getCity ());
        Glide.with (getActivity ())
                .load(Constant.BASE_IP+Info.getImage ())
                .centerCrop()
                .placeholder(getResources ().getDrawable (R.drawable.img))
                .crossFade()
                .into(imgUser);

    }

    public void counts(){
        txtCount.setText (""+mList.size ());
        if(Build.VERSION.SDK_INT >= 16) {
            txtCount.setBackground (Util.drawCircle (getActivity (), 25, 25, getResources ().getColor (R.color.yellow)));
        }else{
            txtCount.setBackgroundDrawable (Util.drawCircle (getActivity (), 25, 25, getResources ().getColor (R.color.yellow)));
        }
    }

    private void drawMarker(LatLng point , int index){
        MarkerOptions markerOptions = new MarkerOptions();
        markerOptions.position (point);
        Marker marker = googleMap.addMarker(markerOptions);
        markerPosition.put (marker,index);
    }

    public void findViews(View view){
        imgUser = (ImageView)view.findViewById (R.id.img_user);
        txtName = (TextView)view.findViewById (R.id.txt_name);
        txtLocation = (TextView)view.findViewById (R.id.txt_location);
        txtCount = (TextView)view.findViewById (R.id.txt_count);
    }


    @Override
    public boolean onMarkerClick (Marker marker) {
        int index = markerPosition.get (marker);
        details (mList.get (index));
        return false;
    }

    @Override
    public void onResume () {
        super.onResume ();
    }
}

fragment_map.xml

 <FrameLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <fragment
            android:id="@+id/map"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            class="com.google.android.gms.maps.SupportMapFragment"/>

</FrameLayout>

Logcat 错误:

java.lang.NullPointerException
            at com.example.map.fragment.MapFragment.googleMapsData(MapFragment.java:105)
            at com.example.map.fragment.MapFragment.onCreateView(MapFragment.java:68)
            at android.support.v4.app.Fragment.performCreateView(Fragment.java:1789)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
            at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740)
            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
            at android.support.v4.app.FragmentManagerImpl.run(FragmentManager.java:458)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:146)
            at android.app.ActivityThread.main(ActivityThread.java:5602)
            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:1283)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
            at dalvik.system.NativeStart.main(Native Method)

:

1) 我在我的代码中导入了 import android.support.v4.app.Fragment;

2) 当我在 Activity 中使用它时,代码运行良好。只有当我从 Activity 切换到 Fragment.

时才会出现问题

提前致谢。您所有的解决方案对于解决我的问题都会更有用和有价值。

我刚开始使用地图时,很久以前就遇到过同样的问题。问题是因为加载 google 地图需要时间(如果你在片段内部使用,你可以预期这个加载时间会很长)并且当你在加载地图之前尝试访问地图时,你会得到 NullPointerException 说地图引用为空。您应该先等待地图加载,然后再访问地图视图。您已经为此预定义了回调,下面是您应该如何使用它。

supportMapFragment.getMapAsync(new OnMapReadyCallback() {

        @Override
        public void onMapReady(GoogleMap map) {

            googleMap = map; 
        googleMap.setMapType (GoogleMap.MAP_TYPE_NORMAL);
        googleMap.setOnMarkerClickListener(this);
        googleMap.setMyLocationEnabled(true);

            for(int i=0;i<mList.size ();i++){
                drawMarker (new LatLng (Double.parseDouble (mList.get (i).getLatitude ()), Double.parseDouble (mList.get (i).getLongitude ())),i);
            }

        CameraPosition cameraPosition = new CameraPosition.Builder()
                .target (new LatLng (Double.parseDouble ("13.0900"), Double.parseDouble ("80.2700")))
                .zoom (7)                              
                .build ();                   


        googleMap.animateCamera(CameraUpdateFactory.newCameraPosition (cameraPosition), new GoogleMap.CancelableCallback () {

            @Override
            public void onFinish() {
                CameraUpdate cu_scroll = CameraUpdateFactory.scrollBy(-300, 70);
                googleMap.animateCamera(cu_scroll);
            }

            @Override
            public void onCancel() {
            }
        });
        }
    });