2016-07-18 8 views
1

地図の断片とリストの断片を含むスワップタブでアプリが実行されます。 4.3から5.1へのAPIを持つすべてのデバイス上のアプリworkfの罰金が、私はAPI 6.0とAndroidデバイス上で実行したときに、私はこのエラーをrecive:GoogleマップのエラーでAndroid 6.0アプリがクラッシュするnull

java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.GoogleMap com.google.android.gms.maps.SupportMapFragment.getMap()' on a null object reference 

このファイルのスニペットコードがエラーを生成します。

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

    // Inflate the layout for this fragment 
    v = inflater.inflate(R.layout.fragment_mappa, null, false); 

    // To get City-Name from coordinates 
    GPSTracker gpsTracker = new GPSTracker(getActivity()); 

    String cityName = null; 
    Geocoder gcd = new Geocoder(getContext(), Locale.getDefault()); 
    List<Address> addresses = null; 
    try { 
     addresses = gcd.getFromLocation(gpsTracker.getLatitude(), gpsTracker.getLongitude(), 1); 
     if (addresses.size() > 0) { 
      System.out.println(addresses.get(0).getLocality()); 
      cityName = addresses.get(0).getLocality(); 
     } 
     else { 
      //gpsTracker.showSettingsAlert(); 
     } 
     if (cityName == "Rome"){ 
      nome_citta = "Roma"; 
     } 
     if (cityName == "Florence") { 
      nome_citta = "Firenze"; 
     } 
     if (cityName == "Valencia") { 
      nome_citta = "Valence"; 
     } 
     nome_citta = cityName; 

    } catch (IOException e) { 
     e.printStackTrace(); 

    } 

    /*ImageButton b = (ImageButton) v.findViewById(R.id.refresh); 
    b.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new TabFragment()).commit(); 
     } 
    });*/ 






    GPSTracker mGPS = new GPSTracker(getActivity()); 
    GPSService mGPSService = new GPSService(getActivity()); 
    Double la = mGPSService.getLatitude(); 
    /*mGPSService.getLocation(); 
    if (mGPS.canGetLocation()) { 
     address = mGPSService.getLocationAddress(); 
     Log.d("Address","Adrress"+address); 
    } else { 
     mGPS.showSettingsAlert(); 
    }*/ 



    processMap(v,10); 

    // map.setOnCameraChangeListener(getCameraChangeListener()); 

    mClusterManager = new ClusterManager<Car2GoClusterItem>(getActivity(), map); 

    map.setOnCameraChangeListener(mClusterManager); 
    map.setInfoWindowAdapter(mClusterManager.getMarkerManager()); 
    map.setOnMarkerClickListener(mClusterManager); 

    mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<Car2GoClusterItem>() { 
     @Override 
     public boolean onClusterItemClick(Car2GoClusterItem item) { 
      clickedClusterItem = item; 
      return false; 
     } 
    }); 

    //  map.setOnMarkerClickListener(mClusterManager); 
    return v; 



} 

public GoogleMap.OnCameraChangeListener getCameraChangeListener() 
{ 
    return new GoogleMap.OnCameraChangeListener() 
    { 
     @Override 
     public void onCameraChange(CameraPosition position) 
     { 
      Log.d("Zoom", "Zoom: " + position.zoom); 

      if(previousZoomLevel<=15 && position.zoom>15) 
      { 
       map.clear(); 
       processMap(v, 16); 
      } 

      if(previousZoomLevel>=15 && position.zoom<15) 
      { 
       map.clear(); 
       processMap(v, 14); 
      } 

      previousZoomLevel = position.zoom; 
     } 
    }; 
} 

public void processMap(View v, int zoom) { 
    if(map == null) { 
     map = ((SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map)).getMap(); 

    } 


    if(map != null){ 
    // othe code here .................... 
    } 

なぜこのエラーはAndroid 6でのみ発生しますか? この問題を解決するにはどうすればよいですか? おかげ

私は

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

    // Inflate the layout for this fragment 
    v = inflater.inflate(R.layout.fragment_mappa, null, false); 

    // To get City-Name from coordinates 
    GPSTracker gpsTracker = new GPSTracker(getActivity()); 

    String cityName = null; 
    Geocoder gcd = new Geocoder(getContext(), Locale.getDefault()); 
    List<Address> addresses = null; 
    try { 
     addresses = gcd.getFromLocation(gpsTracker.getLatitude(), gpsTracker.getLongitude(), 1); 
     if (addresses.size() > 0) { 
      System.out.println(addresses.get(0).getLocality()); 
      cityName = addresses.get(0).getLocality(); 
     } 
     else { 
      //gpsTracker.showSettingsAlert(); 
     } 
     if (cityName == "Rome"){ 
      nome_citta = "Roma"; 
     } 
     if (cityName == "Florence") { 
      nome_citta = "Firenze"; 
     } 
     if (cityName == "Valencia") { 
      nome_citta = "Valence"; 
     } 
     nome_citta = cityName; 

    } catch (IOException e) { 
     e.printStackTrace(); 

    } 

    /*ImageButton b = (ImageButton) v.findViewById(R.id.refresh); 
    b.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new TabFragment()).commit(); 
     } 
    });*/ 






    GPSTracker mGPS = new GPSTracker(getActivity()); 
    GPSService mGPSService = new GPSService(getActivity()); 
    Double la = mGPSService.getLatitude(); 
    /*mGPSService.getLocation(); 
    if (mGPS.canGetLocation()) { 
     address = mGPSService.getLocationAddress(); 
     Log.d("Address","Adrress"+address); 
    } else { 
     mGPS.showSettingsAlert(); 
    }*/ 



    processMap(v,10); 

    // map.setOnCameraChangeListener(getCameraChangeListener()); 

    mClusterManager = new ClusterManager<Car2GoClusterItem>(getActivity(), map); 

    map.setOnCameraChangeListener(mClusterManager); 
    map.setInfoWindowAdapter(mClusterManager.getMarkerManager()); 
    map.setOnMarkerClickListener(mClusterManager); 

    mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<Car2GoClusterItem>() { 
     @Override 
     public boolean onClusterItemClick(Car2GoClusterItem item) { 
      clickedClusterItem = item; 
      return false; 
     } 
    }); 

    //  map.setOnMarkerClickListener(mClusterManager); 
    return v; 



} 

public GoogleMap.OnCameraChangeListener getCameraChangeListener() 
{ 
    return new GoogleMap.OnCameraChangeListener() 
    { 
     @Override 
     public void onCameraChange(CameraPosition position) 
     { 
      Log.d("Zoom", "Zoom: " + position.zoom); 

      if(previousZoomLevel<=15 && position.zoom>15) 
      { 
       map.clear(); 
       processMap(v, 16); 
      } 

      if(previousZoomLevel>=15 && position.zoom<15) 
      { 
       map.clear(); 
       processMap(v, 14); 
      } 

      previousZoomLevel = position.zoom; 
     } 
    }; 
} 

public void processMap(View v, int zoom) { 


    if(map == null) { 
     map = ((SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map)).getMapAsync(this); 




    } 


    if(map != null){ 
    } 

を設定し、私は、この行にエラーが発生しているOnMapReadyCallback実装する場合:

map = ((SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map)).getMapAsync(this); 

エラーが

答えて

3

getMap()は、Android 6.0で廃止されGoogleマップを返すgetMapAsync、getMapAsync()を使用:

ここ

The previously-deprecated getMap() function is no longer available in the Google Play services SDK. (It is still available in the Google Play services APK that is delivered to Android devices.) The getMap() function has been deprecated since December 2014. See the release blog post for help with converting from getMap() to getMapAsync().

さらに詳しい情報:

https://developers.google.com/maps/documentation/android-api/releases

変更この:このため

public void processMap(View v, int zoom) { 
    if(map == null) { 
     map = ((SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map)).getMap(); 

    } 


    if(map != null){ 
    // othe code here .................... 
    } 

public void processMap(View v, int zoom) { 
    if(map == null) { 
     map = ((SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map)).getMapAsync(this); 

    } 


    if(map != null){ 
    // othe code here .................... 
    } 

@Override 
public void onMapReady(GoogleMap map) { 
    mMap = map; 
    doStuff(); 
} 

そしてOnMapReadyCallback

を実装ここ

詳細情報:あなたの助けを

http://googlegeodevelopers.blogspot.co.uk/2016/06/marker-zindex-and-more-come-to-google.html

+0

感謝。私はgetMapAsyncを見たことがありますが、私はフラグメントを持っています。あなたの変更にgetMapAsyncに関するエラーがあり、doStuff()メソッドを再利用できない場合は – APPGIS

+0

doStuff()はモック関数です。 –

関連する問題