无法在Fragment中检测地图中的当前位置

时间:2016-01-09 08:07:17

标签: android android-fragments google-play-services android-location mapfragment

我可以看到地图,但不会放大当前位置。 try-catch块中的代码中断,可以看到Google Play Services missing !

**这就是发生碰撞的地方**

map = mapFragment.getMap();

以下完整代码:

public class MyMapFragment extends Fragment implements
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener,
    LocationListener {

GoogleMap map;
LatLng latlng;
private LocationRequest lr;
private LocationServices lc; //was LocationClient
MapFragment mapFragment;
//ImageView iv;
private static View view;

@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);

        SupportMapFragment mMapFragment = SupportMapFragment.newInstance();
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        transaction.add(R.id.map_container, mMapFragment).commit();

        mapFragment = ((MapFragment) this.getActivity()
                .getFragmentManager().findFragmentById(R.id.map_container));

        map = mapFragment.getMap(); **THIS IS WHERE THE CRASH HAPPENS **
        map.getUiSettings().setAllGesturesEnabled(false);
        map.getUiSettings().setMyLocationButtonEnabled(false);

        if (ContextCompat.checkSelfPermission(getActivity(),
                Manifest.permission.ACCESS_FINE_LOCATION) // this might need massaged to 'android.permission.USE_FINGERPRINT'
                != PackageManager.PERMISSION_GRANTED) {
            map.setMyLocationEnabled(true);
        } else {
            map.setMyLocationEnabled(false);
        }

        map.getUiSettings().setZoomControlsEnabled(false);

        MapsInitializer.initialize(getActivity());


    Toast.makeText(getActivity(), "Printing from MyMapFragment", Toast.LENGTH_LONG).show();
    return view;
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    Log.d("Attach", "on attach");
}

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


@Override
public void onConnected(@Nullable Bundle bundle) {

}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onLocationChanged(Location location) {

}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

}
}

Android XML文件:R.layout.fragment_map.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical">


<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/map_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />


</LinearLayout>

堆栈跟踪

FATAL EXCEPTION: main
                                                                              Process: com.mavdev.gunfreebusinesses, PID: 29988
                                                                                  java.lang.RuntimeException: Unable to start activity  ComponentInfo{com.mavdev.gunfreebusinesses/com.mavdev.gunfreebusinesses.activities.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.GoogleMap com.google.android.gms.maps.MapFragment.getMap()' on a null object reference
                                                                              at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339)
                                                                              at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413)
                                                                              at android.app.ActivityThread.access$800(ActivityThread.java:155)
                                                                              at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                              at android.os.Looper.loop(Looper.java:135)
                                                                              at android.app.ActivityThread.main(ActivityThread.java:5343)
                                                                              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:905)
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
                                                                           Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.GoogleMap com.google.android.gms.maps.MapFragment.getMap()' on a null object reference
                                                                              at com.mavdev.gunfreebusinesses.fragments.MyMapFragment.onCreateView(MyMapFragment.java:77)
                                                                              at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)
                                                                              at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
                                                                              at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)
                                                                              at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
                                                                              at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)
                                                                              at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:330)
                                                                              at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:547)
                                                                              at com.mavdev.gunfreebusinesses.activities.MainActivity.onStart(MainActivity.java:385)
                                                                              at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1259)
                                                                              at android.app.Activity.performStart(Activity.java:6026)
                                                                              at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2302)
                                                                              at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413) 
                                                                              at android.app.ActivityThread.access$800(ActivityThread.java:155) 
                                                                              at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317) 
                                                                              at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                              at android.os.Looper.loop(Looper.java:135) 
                                                                              at android.app.ActivityThread.main(ActivityThread.java:5343) 
                                                                              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:905) 
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) 

1 个答案:

答案 0 :(得分:1)

Xml代码

      <fragment android:id="@+id/map_container"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:name="com.google.android.gms.maps.MapFragment"/>

使用

 GoogleMap map = ((MapFragment)   getFragmentManager().findFragmentById(R.id.map_container)).getMap();

而不是

map = mapFragment.getMap();

在Activity java代码

private MapFragment getMapFragment() {
FragmentManager fm = null;

Log.d(TAG, "sdk: " + Build.VERSION.SDK_INT);
Log.d(TAG, "release: " + Build.VERSION.RELEASE);

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
  // using getFragmentManager
    fm = getFragmentManager();
} else {
  //using getChildFragmentManager
    fm = getChildFragmentManager();
}

return (MapFragment) fm.findFragmentById(R.id.map_container);
}