[英]Cannot solve getMapAsync in Fragment
I want to get the user's current location in map I cannot pass 'this' as a parameter in mapAsync function I am getting an error in getMapAsync(this)
. 我想获取用户在地图中的当前位置,我无法在mapAsync函数中将“ this”作为参数传递给
getMapAsync(this)
的错误。 It tells Incompatible type. 它告诉不兼容的类型。
required : com.google.android.gms.map.GoogleMap
必需的 :
com.google.android.gms.map.GoogleMap
found : void how can I solve this issue ?
发现 :
void how can I solve this issue ?
I also tried getActivity.getApplicationContext()
but it also not worked ! 我也尝试了
getActivity.getApplicationContext()
但是它也没有用! Here I am provide code please check it 我在这里提供代码,请检查一下
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 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>
call your code inside Fragment
onCreateView() 在
Fragment
onCreateView()中调用您的代码
@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;
}
For more information read getMapAsync() in Fragment 有关更多信息,请阅读Fragment中的getMapAsync()。
Try this code 试试这个代码
try {
if (map == null) {
((MapView) getView().findViewById(R.id.map)).getMapAsync(this);
}
}catch (NullPointerException e){
e.printStackTrace();
}
Hope this helps! 希望这可以帮助!
What you're missing is that getMapAsync
is an asynchronous function. 您缺少的是
getMapAsync
是一个异步函数。 meaning it does not return a map object right away. 表示它不会立即返回地图对象。 So you cannot just write
map = mapFragment.getMapAsync();
因此,您不能只写
map = mapFragment.getMapAsync();
Instead you have to do this : 相反,您必须这样做:
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.
}
Here, onMapReady
is called when the map object s available, so the rest of your initialization code will go there. 在这里,
onMapReady
图对象可用时,将调用onMapReady
,因此其余的初始化代码将在那里。 You also have to implement OnMapReadyCallback
, but I see you've already done that. 您还必须实现
OnMapReadyCallback
,但我看到您已经做到了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.