2017-02-16 7 views
0

Ich möchte die aktuelle Position des Benutzers in map abrufen Ich kann 'this' nicht als Parameter in mapAsync-Funktion übergeben Ich erhalte einen Fehler in getMapAsync(this). Es wird der Inkompatible Typ angezeigt. com.google.android.gms.map.GoogleMapGetMapAsync kann nicht in Fragment gelöst werden

gefunden:

erforderlich void how can I solve this issue ?

Ich habe auch versucht getActivity.getApplicationContext() aber es funktioniert auch nicht! Hier bin ich bieten Code Bitte überprüfen Sie es

public class MapsActivity extends Fragment implements 
    OnMapReadyCallback, 
    View.OnClickListener , 
    GoogleApiClient.ConnectionCallbacks, 
    GoogleApiClient.OnConnectionFailedListener, 
    LocationListener { 

private GoogleMap map; 
private MapView mapView; 
private boolean mapsSupported = true; 
private GoogleApiClient mGoogleApiClient; 
MapFragment mapFragment; 
@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    MapsInitializer.initialize(getActivity()); 

    if (mapView != null) { 
     mapView.onCreate(savedInstanceState); 
    } 
    initializeMap(); 
} 
private void initializeMap() { 
    SupportMapFragment mapFragment = (SupportMapFragment) getActivity().getSupportFragmentManager() 
      .findFragmentById(R.id.map); 
    //mapFragment = (SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map); 
    if (map == null) { 
     **map = mapFragment.getMapAsync(this);** 
    } 
    // Enable Zoom 
    map.getUiSettings().setZoomGesturesEnabled(true); 
    //set Map TYPE 
    map.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
    //enable Current location Button 
    map.setMyLocationEnabled(true); 
    LocationManager locationManager = (LocationManager)getActivity().getSystemService(getActivity().LOCATION_SERVICE); 
    Criteria criteria = new Criteria(); 
    String bestProvider = locationManager.getBestProvider(criteria, true); 
    if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     return; 
    } 
    Location location = locationManager.getLastKnownLocation(bestProvider); 
    if (location != null) { 
     onLocationChanged(location); 
    } 
    locationManager.requestLocationUpdates(bestProvider, 2000, 0, this); 
} 

maps.xml

<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:id="@+id/map" 
tools:context=".MapsActivity" 
android:name="com.google.android.gms.maps.SupportMapFragment" 
tools:layout="@layout/abc_action_menu_layout"/> 

<Button 

    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Nearby Resturants" 
    android:id="@+id/btn_rest" 
    android:layout_gravity="bottom" /> 


    </RelativeLayout> 
+0

können Sie verwenden ** GetMapAsync (getActivity()); ** – pulkit

+0

@pulkit funktioniert nicht – SFAH

+0

Für 'getMapAsync()' zu arbeiten, muss 'R.id.map' ein' MapFragment' Element sein. aber es ist ein normales Fragment – ShahiM

Antwort

0

Versuchen Sie diesen Code

try { 
     if (map == null) { 
      ((MapView) getView().findViewById(R.id.map)).getMapAsync(this); 

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

hoffe, das hilft!

+0

Danke Es hat funktioniert! : D @ Tahmid Rahman – SFAH

+0

Gut zu wissen! Bitte markieren Sie es akzeptiert (das Häkchen auf der linken Seite der Antwort), damit es anderen Entwicklern in Zukunft helfen kann. –

2

rufen Sie Ihren Code innerhalb FragmentonCreateView()

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

    View viewOBJ= inflater.inflate(R.layout.xxx, null, false); 

    SupportMapFragment mapFragment = (SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map); 
    mapFragment.getMapAsync(this); 
    return viewOBJ; 
} 

Weitere Informationen lesen getMapAsync() in Fragment

+0

Ich habe versucht, aber nicht funktioniert:/ – SFAH

0

Was Sie vermissen, ist, dass getMapAsync eine asynchrone Funktion ist. Das bedeutet, dass ein Kartenobjekt nicht sofort zurückgegeben wird. So können Sie nicht nur schreiben map = mapFragment.getMapAsync();

Stattdessen haben Sie, dies zu tun:

private void initializeMap() { 
    SupportMapFragment mapFragment = (SupportMapFragment) getActivity().getSupportFragmentManager() 
     .findFragmentById(R.id.map); 
    if (map == null) { 
    mapFragment.getMapAsync(this); 
    } 
} 

@Override 
public void onMapReady(GoogleMap googleMap) { 
    map = googleMap; 

    // Enable Zoom 
    map.getUiSettings().setZoomGesturesEnabled(true); 
    //set Map TYPE 
    map.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
    //enable Current location Button 
    map.setMyLocationEnabled(true); 

    //... rest of your map related code. 
} 

Hier onMapReady aufgerufen wird, wenn das Kartenobjekt s zur Verfügung, so dass der Rest Ihres Initialisierungscode dorthin gehen. Sie müssen auch OnMapReadyCallback implementieren, aber ich sehe, Sie haben das bereits getan.

Verwandte Themen