1

zeigt habe ich ein Fragment-Klasse, die ein MapView enthält.Google Map Fragment nicht aktuellen Standort Schaltfläche

Es funktioniert gut, ist das einzige Problem, das es nicht die aktuelle Standort-Taste nicht zeigt, i es wahr gesetzt:

nMap = mapView.getMap(); 
nMap.setMyLocationEnabled(true); 
nMap.getUiSettings().setZoomControlsEnabled(true); 

und ich hinzufügen, Berechtigungen in meinem Manifest XML-Datei:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> 

aber es hat das Problem nicht gelöst.

mapView = (MapView) rootView.findViewById(R.id.map); 
mapView.onCreate(savedInstanceState); 
if (mapView != null) { 
    nMap = mapView.getMap(); 
    nMap.setMyLocationEnabled(true); 
    nMap.getUiSettings().setZoomControlsEnabled(true); 
    mClusterManager = new ClusterManager<>(this.getActivity(), nMap); 
    nMap.setOnCameraChangeListener(mClusterManager); 
    nMap.setOnMarkerClickListener(mClusterManager); 
} 

Update 1:

Das ist sehr seltsam ich diesen Code implementiert:

public class MainFragment extends Fragment implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener { 

//Define Variables that necessary for app 
CameraUpdate update; 
JSONArray array; 
ClusterManager<ItemCluster> mClusterManager; 
View rootView; 
ItemCluster offsetItem; 
MapView mapView; 
GoogleMap nMap; 
GoogleApiClient mLocationClient; 

/* 
the Constructor of Main Fragment that get the JSON array as input from AsyncTask 
which download the JSON file from Meteoapps website 
*/ 
@SuppressLint("ValidFragment") 
public MainFragment(JSONArray input) { 
    array = input; 
} 

//----Default constructor 
public MainFragment() { 
} 


// Create the view when the fragment initialized 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
    mapView = (MapView) rootView.findViewById(R.id.map); 
    mapView.onCreate(savedInstanceState); 
    mapView.getMapAsync(this); 
    return rootView; 
} 

@Override 
public void onMapReady(GoogleMap googleMap) { 

    if (mapView != null) { 
     nMap = googleMap; 
     nMap.setMyLocationEnabled(true); 
     nMap.getUiSettings().setZoomControlsEnabled(true); 
     mClusterManager = new ClusterManager<>(this.getActivity(), nMap); 
     mClusterManager.setRenderer(new OwnIconRendered(getActivity().getApplicationContext(), nMap, mClusterManager)); 
     nMap.setOnCameraChangeListener(mClusterManager); 
     nMap.setInfoWindowAdapter(mClusterManager.getMarkerManager()); 
     nMap.setOnMarkerClickListener(mClusterManager); 
     mLocationClient = new GoogleApiClient.Builder(getActivity()) 
       .addApi(LocationServices.API) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 
     mLocationClient.connect(); 
     Location currentlocation = LocationServices.FusedLocationApi 
        .getLastLocation(mLocationClient); 

    } 

i die getLastLocation wissen Problem verursachen kann in diesem Fall aber nicht, weil ich den Code anprobiert ein anderer Code und es funktioniert, dann, wenn ich versuche, mich abzumelden currentlocation.getLatitude() ich stelle diesen Fehler:

System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference

+0

Können Sie die Änderungen, die Sie vorgenommen haben, näher erläutern? – Sufian

+0

@Sufian Ich benutzte so: 'mapView = (MapView) rootView.findViewById (R.id.map); mapView.onCreate (savedInstanceState); if (mapView! = Null) { nMap = mapView.getMap(); nMap.setMyLocationEnabled (true); nMap.getUiSettings(). SetZoomControlsEnabled (true); mClusterManager = neuer ClusterManager <> (this.getActivity(), nMap); nMap.setOnCameraChangeListener (mClusterManager); nMap.setOnMarkerClickListener (mClusterManager); } '' Wenn – Blacksword

+0

OnMapReadyCallback' nur gibt es 24 auf API, dann wird es nie 23 auf API aufgerufen werden Was war Android-Version auf dem Gerät/Emulator Sie getestet? – Sufian

Antwort

0

getMap() is deprecated, verwenden getMapAsync(this) statt. Implementieren Sie auch eine OnMapReadyCallback, auf der onMapReady() Methode, legen Sie Ihre Kartenkonfigurationen dort fest. Ansonsten sehe ich keine Probleme mit der Konfiguration der Karte. Hoffentlich wird dies helfen, das Problem zu lösen.

Glückliche Codierung!

+0

hi, ich habe das ausprobiert auch nichts ist passiert es ist wirklich komisch ich habe eine andere Demo App ausprobiert und es hat funktioniert, aber der Unterschied war, dass er alles in MainActivity nicht in einem Fragment gemacht hat, also kann ich nicht wissen, was mit meinen Codes falsch ist – Blacksword

Verwandte Themen