2017-02-16 9 views
0

Я хочу получить текущее местоположение пользователя на карте. Я не могу передать «это» в качестве параметра в функции mapAsync . Я получаю ошибку в getMapAsync(this). Он сообщает Несовместимый тип.Не удается решить getMapAsync в фрагменте

требуется: com.google.android.gms.map.GoogleMap

найдено: void how can I solve this issue ?

Я также попытался getActivity.getApplicationContext(), но это тоже не сработало! Здесь я предоставить код, пожалуйста, проверьте его

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

вы можете использовать ** getMapAsync (getActivity()); ** – pulkit

+0

@pulkit не работает – SFAH

+0

Для 'getMapAsync()' для работы, 'R.id.map' должен быть элементом« MapFragment ». но это нормальный фрагмент – ShahiM

ответ

0

Попробуйте этот код

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

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

Надеется, что это помогает!

+0

Спасибо, это сработало! : D @Tahmid Rahman – SFAH

+0

Рад узнать! отметьте его принятым (отметьте отметку слева от ответа), чтобы он мог помочь другим разработчикам в будущем. –

2

называют свой код внутри 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; 
} 

Для более подробной информации читайте getMapAsync() in Fragment

+0

Я пробовал, но не работал:/ – SFAH

0

Что вам не хватает, так это то, что getMapAsync является асинхронной функцией. что означает, что он сразу не возвращает объект карты. Таким образом, вы не можете просто написать map = mapFragment.getMapAsync();

Вместо этого вы должны сделать это:

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. 
} 

Здесь onMapReady вызывается, когда объект карты s доступны, так что остальная часть кода инициализации будет идти. Вы также должны реализовать OnMapReadyCallback, но я вижу, вы уже это сделали.